【问题标题】:Customizing dynamic font style and size in a custom dialog box在自定义对话框中自定义动态字体样式和大小
【发布时间】:2014-07-16 14:36:22
【问题描述】:

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

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

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

例如,在每个视图模型中,我都有类似的东西

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

在我的一条消息中,我想让特定消息段的字体加粗并使用不同的颜色/大小。

如何在不弄乱从 xaml 或后面的代码继承的其他消息的情况下做到这一点?

目前,我没有使用任何代码,而且我看到的很多在线示例都使用代码和/或没有动态消息文本框。

有什么想法吗?

【问题讨论】:

    标签: c# wpf xaml mvvm dialog


    【解决方案1】:

    嗯,我认为有几种方法。在您的 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 }"/>
    

    那么你可以:

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

    (在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}"/>
    

    并传递给 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);
    

    通过这种方法,您可以传递任何复杂的控件——在堆栈面板、网格等中。

    编辑 根据您在 cmets 中的问题,您需要在一个 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 道具应该如下所示:

    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 表达式转换为类型“字符串”,因为它不是委托类型。这意味着什么?我不能只提高 RaisepropertyChanged("MessageFontWeight") 吗?
    • @KalaJ,很抱歉,我实现 INotifyPropertyChanged 接口的类使用 lambda,而不仅仅是带有属性名称的字符串。当然,如果您有其他实现,请使用您自己的)它只是一个例子))
    • 嗨登,感谢您的帮助!它有效,但有一个问题。我有一个这种格式的字符串:messageWindow.Message = string1 + string2;我只希望 string2 是粗体,而不是 string1,即使它们是连接的。怎么能这样做?再次感谢您的帮助!!
    • @KalaJ,请参考我的回答中的编辑
    • 我会试一试,让你知道。谢谢@Den
    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 2020-10-15
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多