gpt4 book ai didi

wpf - 使用 IValueConverter 进行动态样式绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 18:11:56 25 4
gpt4 key购买 nike

我正在尝试设置一种样式,该样式在 App.xaml 中定义。 ,在加载用户控件时动态加载,并且由于某种原因它没有应用样式(即没有发生错误,只是没有应用样式)。

我确定这是因为我定义了错误的绑定(bind),但我无法弄清楚我需要做些什么不同的事情才能让它工作。

App.xaml 样式

我追求的风格是RunningTitleBlock它由我在下面的代码示例中包含的其他几种样式组成。

<Style TargetType="Label">
<Setter Property="Margin" Value="4"/>
</Style>

<Style TargetType="Label"
BasedOn="{StaticResource {x:Type Label}}"
x:Key="HeaderBlock">
<Setter Property="FontSize" Value="16"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="White"/>
</Style>

<Style TargetType="Label"
BasedOn="{StaticResource ResourceKey=HeaderBlock}"
x:Key="TitleBlock">
<Setter Property="Foreground" Value="Black"/>
</Style>

<Style TargetType="Label"
BasedOn="{StaticResource ResourceKey=TitleBlock}"
x:Key="RunningTitleBlock">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0.0, 0.5"
EndPoint="1.0, 0.5">
<GradientStop Color="White" Offset="0.0"/>
<GradientStop Color="Green" Offset="1.0"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>

绑定(bind)用户控件

我正在尝试获取 Binding绑定(bind)到从值转换器返回的值。
Style="{DynamicResource ResourceKey={Binding Path=MonitoringType, Converter={StaticResource TSConverter}}}"

代码

监控类型枚举
public enum MonitoringTypes
{
Running,
Failed,
Paused,
Favorites,
}

用户控制

这里我要做的是连接 MonitoringTypes 的字符串值与一些众所周知的文本一起传入的枚举值,以构建存在于 App.xaml 中的样式名称.值转换器被称为 返回正确的值,但由于某种原因,样式不适用。
/// <summary>
/// Interaction logic for MonitorWorkflow.xaml
/// </summary>
public partial class MonitorWorkflow : UserControl
{
public MonitorWorkflow(MonitoringTypes monitoringType)
{
InitializeComponent();

this.DataContext = new MonitorWorkflowViewModel { MonitoringType = monitoringType };
}
}

public class MonitorWorkflowViewModel
{
public MonitoringTypes MonitoringType { get; set; }
}

public class TitleStyleValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var type = (MonitoringTypes)value;
return string.Format("{0}TitleBlock", Enum.GetName(typeof(MonitoringTypes), type));
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return Enum.Parse(typeof(MonitoringTypes), value.ToString().Substring(0, value.ToString().IndexOf("TitleBlock")));
}
}

最佳答案

我的建议是跳过 DynamicResource声明并使用 Converter提供Style直接地。

Style="{Binding Path=MonitoringType, Converter={StaticResource TSConverter}}"

TSConverter ,您可以返回 Style而不是一个字符串。有点像这样:
public class TitleStyleValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
var type = (MonitoringTypes)value;
var styleToReturn = FindResource(
string.Format("{0}TitleBlock",
Enum.GetName(typeof(MonitoringTypes), type)));
if (styleToReturn != null)
return (Style)styleToReturn;
else
return null;
}

public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
// not sure if you need this anymore...
return Enum.Parse(typeof(MonitoringTypes), value.ToString().Substring(0,
value.ToString().IndexOf("TitleBlock")));
}
}

这就是我所做的,但使用了以下代码。我实际上只是回答了我自己的问题,而您也回答了它。好时机!
public class TitleStyleValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var type = (MonitoringTypes)value;
return App.Current.Resources[string.Format("{0}TitleBlock", Enum.GetName(typeof(MonitoringTypes), type))];
}

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return Enum.Parse(typeof(MonitoringTypes), value.ToString().Substring(0, value.ToString().IndexOf("TitleBlock")));
}
}

关于wpf - 使用 IValueConverter 进行动态样式绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12060761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com