我需要读取Padding
(或其他Style
)的Button
中存储的FrameworkElement
等值。该怎么做?
例如,如果我像这样为Style
做一个Button
:
Style style = new Style(typeof(Button));
style.Setters.Add(new Setter(Button.HeightProperty, 70));
MyButton.Style = style;
所以...以后如何阅读例如Setter HeightProperty
?那下面的情况呢?如何获得Padding
?
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
<ContentPresenter x:Name="ContentPresenter"
Padding="11,15,7,0"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
我试图通过
获取信息Style ButtonStyle = MyButton.GetStyle();
但是在此之后我根本不知道如何继续。
答案 0 :(得分:1)
在第一种情况下,您可以使用GetValue
方法来获取当前应用的值:
var value = (double)MyButton.GetValue(Button.HeightProperty);
或更简单地:
var value = MyButton.Height;
在第二种情况下,问题更加复杂,因为Padding
是模板本身而不是按钮的一部分。要访问它,您将需要以下帮助程序方法:
public IEnumerable<TChildType> FindChildren<TChildType>(DependencyObject parent)
{
var count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
if (child is TChildType typedChild)
{
yield return typedChild;
}
foreach (var nestedChild in FindChildren<TChildType>(child))
{
yield return nestedChild;
}
}
}
这会遍历父级下的VisualTree
并搜索某种类型的后代。我们可以这样使用它:
var contentPresenter = FindChildren<ContentPresenter>(MyButton).First();
Debug.WriteLine(contentPresenter.Padding);
请确保仅在实际加载页面后才调用FindChildren
方法(例如,在Page.Loaded
中,例如在OnNavigatedTo
事件处理程序或Page
中)构造函数,模板子代还不存在,帮助器将不返回任何子代。