【问题标题】:Access children from contextmenu control template c#从 contextmenu 控件模板 c# 访问子项
【发布时间】: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


【解决方案1】:

WPF 控件通常在需要时才会加载,因此在您的情况下,您可以访问矩形的最早点将是 按钮的上下文菜单加载之后(发生在它之前首次打开):

将此添加到您的 XAML:

<ContextMenu x:Name="btconmn" Loaded="Btconmn_OnLoaded">

这在你后面的代码中:

private void Btconmn_OnLoaded(object sender, RoutedEventArgs e)
{
    var template = btconmn.Template;
    var myControl = (Rectangle)template.FindName("newfolder", btconmn);
}

【讨论】:

  • 我很高兴您的代码有效。我知道after the button's contextmenu is loaded,这就是为什么我尝试将代码应用于上下文菜单的opened 事件。为什么没有工作呢?我认为当 econtextmenu 打开时,opened 事件可能会立即触发。这就是为什么我也将代码应用于close 事件,但它们都不起作用......为什么会这样?
  • opened 事件可能在整个可视化树完成加载和closed再次卸载之后触发。跨度>
  • 是否可以将动画(故事板)应用于上下文菜单?通常它会弹出,看起来它的不透明度从 0 变为 1...有什么方法可以改变它?
  • @F.raiyan 可能是this seems promising - 但我们现在有点超出这个问题的范围。
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2017-11-04
  • 1970-01-01
  • 2011-08-29
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多