【发布时间】:2018-02-26 18:25:06
【问题描述】:
我正在尝试从控件的上下文菜单的控件模板访问控件。我的 xaml 是:
<Button x:Name="button1" ContextMenuService.Placement="top" Content="Button" HorizontalAlignment="Left" Margin="2,543,0,0" VerticalAlignment="Top" Width="75" Grid.ColumnSpan="2">
<Button.ContextMenu>
<ContextMenu x:Name="btconmn" >
<ContextMenu.Template>
<ControlTemplate>
<Grid x:Name="newgrid" Width="183" Height="190">
<Rectangle Fill="#FF263349" x:Name="newfolder" HorizontalAlignment="Left" VerticalAlignment="Top" Width="179" Height="32" Margin="2,1,0,0"/>
</Grid>
</ControlTemplate>
</ContextMenu.Template>
</ContextMenu>
</Button.ContextMenu>
</Button>
我在这里尝试访问newfolder 矩形。到目前为止我试过了:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
var template = btconmn.Template;
var myControl = (Rectangle)template.FindName("newfolder", btconmn);
}
它返回一个空引用异常。任何帮助?
【问题讨论】:
-
你在哪里覆盖
OnApplyTemplate?由于您的代码中没有自定义类,我猜错了。 -
它在主类/窗口类中。
-
如果您编写一个继承自
ContextMenu的自定义类,那么是的 - 这将是这样做的最佳位置,但您还应该向该类添加一个 TemplatePartAttribute ([TemplatePart("newfolder")]) . -
可能是因为您正在混合 WPF (DirectX) 和 WindowForms (GDI+) 类,这是非常不必要的(当 Clemens 告诉您您在 WPF 中做错了 - 那么您做错了,他知道他在说什么)
-
不是个人,但我偶尔会回答/讨论相同的问题,到目前为止,我始终同意他所说/写的内容。很高兴我能帮忙:)
标签: c# wpf xaml controltemplate