Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在另一种样式中使用一种样式的值?_C#_Wpf_Xaml - Fatal编程技术网

C# 如何在另一种样式中使用一种样式的值?

C# 如何在另一种样式中使用一种样式的值?,c#,wpf,xaml,C#,Wpf,Xaml,我正在尝试创建一种样式,以确保组合框与文本框具有相同的高度 我希望通过重用默认文本框样式的高度来实现这一点 <Style TargetType="ComboBox"> <Setter Property="Height" Value="<Height from default TextBox style>" /> </Style> 我是否遗漏了一些明显的内容,或者这是不可能的?您可以使用BasedOn属性 <Style x;Key

我正在尝试创建一种样式,以确保组合框与文本框具有相同的高度

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

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


我是否遗漏了一些明显的内容,或者这是不可能的?

您可以使用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上的更多示例:


您可以创建默认文本框和组合框样式所基于的样式。

这是我能得到的最接近的样式:

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;
}
这是可行的,但当
样式
使用
模板
时将失败。你也可以沿着它走,但是根据渲染的不同,它会有另一个高度


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

这不是我想要使用的。我想使用文本框样式中的默认值。不管这个值是多少。我不想硬编码。此外,我不想将ComboBox样式建立在TextBox样式的基础上,因为它不仅会继承高度,还会继承所有其他值——如果可能的话。是的,但是类型完全不同,所以继承是不可能的。有人怎么能对这一点进行投票呢。这还不接近答案。@knopo:你显然不明白这个问题。这是关于默认样式以及在控件类型不匹配时将一种样式的属性转换为另一种样式的问题。我认为这是一个有效的答案,这是一个折衷方案,但只是因为OP提出了一些不可能的问题。@Daniel:如果您可以使用一些C#来获得默认样式,你可以很容易地编写一个访问它的
StaticResource
。@Patrickhoffman:这是一个不错的主意,是万不得已的办法。然而,如果可能的话,我想纯粹用XAML来做这件事。@DanielHilgarth:这有关系吗@帕特里克霍夫曼:是的,它是相关的,但我不确定它在我的情况下是否起作用。为什么不直接将高度转化为一个资源(例如,
50
),然后通过
将其加载到两者中,因为你已经明确地在一个上命名了?正如你在问题本身下面与克里斯的持续讨论中所看到的那样,整个事情基本上毫无意义;-)