我已经在xaml(view)中创建了自己的自定义消息/对话框,并且我有一个提升message属性的viewmodel。我将message属性绑定到我的xaml中的文本块。
现在我想知道一件事,我如何更改viewmodel中特定动态字符串的字体样式和大小?
因为我的每个视图模型的消息都不同。
例如,在每个视图模型中,我都有类似
的内容messagewindow.Message = "This is a new message";
dialogService.ShowDialog(Success, messageWindow);
在我的一条消息中,我想为特定的消息段设置字体粗体和不同的颜色/大小。
如何在不弄乱从xaml或代码后面继承的其他消息的情况下如何做到这一点?
目前,我没有使用任何代码,我在网上看到很多使用代码和/或没有动态消息文本框的示例。
有什么想法吗?
答案 0 :(得分: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
替换视图中的文本块。在您的虚拟机中为您的控件创建一个属性:
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);
使用这种方法,您可以传递任何复杂性的控件 - 在stackpanels,gridids等中。
修改强> 根据您在评论中的问题,您需要在一个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
+然后使用你的消息道具应该是这样的:
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>