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

C# 在自定义对话框中自定义动态字体样式和大小,c#,wpf,xaml,mvvm,dialog,C#,Wpf,Xaml,Mvvm,Dialog,我已经在xaml(视图)中创建了自己的自定义消息/对话框,并且有一个引发消息属性的viewmodel。我将message属性绑定到xaml中的textblock 现在我想知道一件事,如何在viewmodel中更改特定动态字符串的字体样式和大小 因为我的消息对于我拥有的每个viewmodel都是不同的 例如,在每个viewmodel中,我都有 messagewindow.Message = "This is a new message"; dialogService.ShowDialog(Succ

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

现在我想知道一件事,如何在viewmodel中更改特定动态字符串的字体样式和大小

因为我的消息对于我拥有的每个viewmodel都是不同的

例如,在每个viewmodel中,我都有

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的一个属性:

<TextBlock Text="{Binding Message}" FontWeight="{Binding MessageFontWeight }"/>
(在VM构造函数中,您可能需要设置默认值
MessageFontWeight=FontWeights.Normal;

更有趣的方法是将视图中的文本块替换为
ContentControl
。在VM中,为控件创建属性:

object  _messageControl; 
public object MessageControl
           {
               get { return _messageControl; }
               set
               {
                   if (_messageControl!= value)
                   {
                       _messageControl = value;
                       RaisePropertyChanged(() => MessageControl);
                   }
               }
           }
在您的Xaml中:

<ContentControl Content="{Binding MessageControl}"/>
通过这种方法,您可以传递任何复杂的控件–在堆栈面板、网格等中

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

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
传递给消息时,它们之间应该有一些拆分器-
string1+“^”+string2
+然后在消息中使用道具应该如下所示:

public string Message
                   {
  get { 
    return _message; 
    }
    set
    {
     if (_message!= value)
     {
     _message = value;
        string[] str=value.Split('^');
        String1=str[0];
        String2=str[1];
       RaisePropertyChanged("Message");
       }
      }
    }
最后,您的视图的XAML代码:

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


对于您的第一个方法,我在这一行收到一个错误:“RaisePropertyChanged(()=>MessageFontWeight);”它说无法将lambda表达式转换为类型“string”,因为它不是委托类型。这是什么意思?我能不能提高RaisepropertyChanged(“MessageFontWeight”)?@KalaJ,很抱歉,我实现INotifyPropertyChanged接口的类使用的不仅仅是名称为property的字符串。当然,如果您有其他实现(使用您自己的实现)这只是一个示例)嗨,谢谢您的帮助!它只解决了一个问题。我有一个如下格式的字符串:messageWindow.Message=string1+string2;我只希望string2是粗体的,而不是string1,即使它们是串联的。你怎么能这么做?再次感谢你的帮助@KalaJ,请参考我回答中的编辑,我会尝试一下,让你知道。谢谢@Den
public string Message
                   {
  get { 
    return _message; 
    }
    set
    {
     if (_message!= value)
     {
     _message = value;
        string[] str=value.Split('^');
        String1=str[0];
        String2=str[1];
       RaisePropertyChanged("Message");
       }
      }
    }
<TextBlock>
<Run Text="{Binding String1}"/>
<Run FontWeight="Bold" Text="{Binding String2}"/>
</TextBlock>