如何在另一种风格中使用一种风格的价值?

时间:2014-10-07 13:09:23

标签: c# wpf xaml

我正在尝试创建一个样式,以确保ComboBoxes与TextBoxes具有相同的高度。

我希望通过重用默认TextBox样式的高度来实现这一点。

<Style TargetType="ComboBox">
    <Setter Property="Height" Value="<Height from default TextBox style>" />
</Style>

我错过了一些明显的东西,或者这是不可能的?

2 个答案:

答案 0 :(得分:1)

您可以使用BasedOn属性。

<Style x;Key="MyStyle" TargetType="Control">
    <Setter Property="Height" Value="10" />
</Style>

<Style TargetType="TextBox" BasedOn="{StaticResource MyStyle}">
    ...
</Style>

<Style TargetType="ComboBox" BasedOn="{StaticResource MyStyle}">
    ...
</Style>

查看MSDN上的更多示例:http://msdn.microsoft.com/en-us/library/system.windows.style.basedon(v=vs.110).aspx

您可以创建默认TextBox和ComboBox样式所基于的样式。

答案 1 :(得分:1)

这是我能得到的尽可能接近:

Style defaultStyle = (Style)Application.Current.TryFindResource(typeof(TextBox));

object o = this.GetPropertyValue(defaultStyle, "Height");

GetPropertyValue的位置:

private object GetPropertyValue(Style style, string propertyName)
{
    foreach (Setter s in style.Setters)
    {
        if (s.Property.Name == propertyName)
        {
            return s.Value;
        }
    }

    if (style.BasedOn != null)
    {
        return GetPropertyValue(style.BasedOn, propertyName);
    }

    return null;
}

这可行,但Style使用Template时会失败。你也可以走下去,但根据渲染,它会有另一个高度。

为了在XAML中使用它,你必须创建一个具有调用此方法的属性的静态类。