在自定义对话框中自定义动态字体样式和大小

本文关键字:自定义 样式 动态 对话框 字体 | 更新日期: 2023-09-27 18:13:16

我已经在xaml (view)中创建了自己的自定义消息/对话框,并且我有一个引发message属性的视图模型。我将message属性绑定到xaml中的一个文本块。

现在我想知道一件事,我怎么能改变我的视图模型内的一个特定的动态字符串的字体样式和大小?

因为我的消息是不同的每个视图模型我有。

。在每个视图模型中,我都有类似

的东西
messagewindow.Message = "This is a new message";
dialogService.ShowDialog(Success, messageWindow);

在我的一个消息,我想使字体粗体和不同的颜色/大小为特定的消息段。

我怎样才能做到这一点,而不会搞乱从xaml继承的其他消息或后面的代码?

目前,我没有使用任何隐藏代码,我在网上看到的很多例子都使用隐藏代码和/或没有动态消息文本框。

任何想法?

在自定义对话框中自定义动态字体样式和大小

我认为有几种方法。在ViewModel中创建需要更改的道具。例如MessageFontWeight:

FontWeight _fw;
public FontWeight MessageFontWeight
        {
            get { return _fw; }
            set
            {
                if (_fw != value)
                {
                    _fw = value;
                    RaisePropertyChanged(() => MessageFontWeight);
                }
            }
        }

在Xaml中绑定到TextBlock的一个prop:

<TextBlock Text="{Binding Message}" FontWeight="{Binding MessageFontWeight }"/>

那么你可以:

messagewindow.Message = "This is a new message";
messagewindow.MessageFontWeight=FontWeights.Heavy;
dialogService.ShowDialog(Success, messageWindow);

(在VM构造器中,您可能希望设置默认值MessageFontWeight = FontWeights.Normal;)

更有趣的方法是用ContentControl替换视图中的文本块。在虚拟机中为控件创建一个属性:

object  _messageControl; 
public object MessageControl
           {
               get { return _messageControl; }
               set
               {
                   if (_messageControl!= value)
                   {
                       _messageControl = value;
                       RaisePropertyChanged(() => MessageControl);
                   }
               }
           }

在你的Xaml:

<ContentControl Content="{Binding MessageControl}"/>

并传递给VM构造器或您所做的控制:

    TextBlock message = new TextBlock();
                message.Text = "Message Text";
                message.FontSize = 27;
                message.FontWeight = FontWeights.Bold;
                message.Foreground = new SolidColorBrush(Colors.AliceBlue);
    messagewindow.MessageControl= message;
    dialogService.ShowDialog(Success, messageWindow);

使用这种方法,您可以传递任何复杂的控件-在堆栈面板,网格等

编辑根据你在评论中的问题,你需要在一个TextBlock内不同的样式。我强烈推荐我建议的第二种方法。您可以执行以下操作:

TextBlock tb1 = new TextBlock();
tb1.TextWrapping = TextWrapping.Wrap;
Run s1 = new Run(string1);
s1.FontWeight = FontWeights.Bold;
Run s2 = new Run(string2);
s2.FontWeight = FontWeights.Normal;
tb1.Inlines.Add(s1); 
tb1.Inlines.Add(s2);
messagewindow.MessageControl= tb1;
dialogService.ShowDialog(Success, messageWindow);

我想很好很容易。如果你想只使用这种语法,因为你显示了messageWindow.Message = string1 + string2,那么你应该有两个额外的道具在你的viewModel。String1和String2,在RaisePropertyChanged中将它们声明为标准道具。当你将string1+string2传递给Message时,它们之间应该有一些分割器- string1+"^"+string2 +然后使用到你的Message prop应该看起来像:

public string Message
                   {
  get { 
    return _message; 
    }
    set
    {
     if (_message!= value)
     {
     _message = value;
        string[] str=value.Split('^');
        String1=str[0];
        String2=str[1];
       RaisePropertyChanged("Message");
       }
      }
    }

View的最终XAML代码:

<TextBlock>
<Run Text="{Binding String1}"/>
<Run FontWeight="Bold" Text="{Binding String2}"/>
</TextBlock>