//xaml
<Window x:Class="WpfApp150.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp150"
mc:Ignorable="d"
WindowState="Maximized"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Image x:Name="img"
HorizontalAlignment="Left"
VerticalAlignment="Top"/>
</Grid>
</Window>
//cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Globalization;
namespace WpfApp150
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
int idx = 0;
private string fontFamilyName = "Arial";
private int fontSize = 120;
string guidStr = "";
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
GenerateTextAsImageSource();
System.Timers.Timer tmr = new System.Timers.Timer();
tmr.Elapsed += Tmr_Elapsed;
tmr.Interval = 1000;
tmr.Start();
}
private void Tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Application.Current?.Dispatcher.BeginInvoke(new Action(() =>
{
GenerateTextAsImageSource();
}));
}
private void GenerateTextAsImageSource()
{
// The text to be rendered
guidStr = Guid.NewGuid().ToString("N");
this.Title = guidStr;
string txtStr = $"{++idx}\n\n{DateTime.Now.ToString("yyyyMMddHHmmssffff")}\n\n" +
$"{WrapTextStr(guidStr, (int)this.ActualWidth - 50, fontFamilyName, fontSize)}";
// Create a DrawingVisual
DrawingVisual drawingVisual = new DrawingVisual();
// Open a DrawingContext to draw on the DrawingVisual
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
// Create a FormattedText object to format the text
FormattedText formattedText = new FormattedText(
txtStr,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface(fontFamilyName),
120,
Brushes.Red,
1.25
);
// Draw the formatted text on the DrawingContext
drawingContext.DrawText(formattedText, new Point(0, 0));
}
// Convert the DrawingVisual to an ImageSource
ImageSource imageSource = ConvertDrawingVisualToImageSource(drawingVisual);
// Set the ImageSource to the Image control
img.Source = imageSource;
this.Title = guidStr;
Application.Current?.Dispatcher.BeginInvoke(new Action(() =>
{
}));
}
string WrapTextStr(string text, int maxWidth, string fontFamilyName, int fontSize)
{
char[] words = text.ToCharArray();
StringBuilder builder = new StringBuilder();
string lineStr = "";
foreach (char word in words)
{
if (GetTextFontsizeWidth(lineStr, fontFamilyName, fontSize) > maxWidth)
{
builder.AppendLine(lineStr);
lineStr = "";
}
lineStr += word;
}
builder.AppendLine(lineStr);
return builder.ToString();
}
private int GetTextFontsizeWidth(string str, string fontFamilyName, int fontSize)
{
FormattedText formattedText = new FormattedText(
str,
System.Globalization.CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface(fontFamilyName),
fontSize,
Brushes.Black, 1.25);
int width = (int)formattedText.Width;
return width;
}
private ImageSource ConvertDrawingVisualToImageSource(DrawingVisual visual)
{
if (visual == null)
{
return null;
}
// Create a RenderTargetBitmap with the desired size
RenderTargetBitmap rtb = new RenderTargetBitmap(
(int)this.ActualWidth,
(int)this.ActualHeight,
96, // DPI X
96, // DPI Y
PixelFormats.Default
);
// Render the DrawingVisual onto the RenderTargetBitmap
rtb.Render(visual);
return rtb;
}
}
}
![]()
![]()
![]()