UWP:无法从Code-Behind访问菜单复选框

时间:2018-08-08 17:46:02

标签: uwp

我创建了一个带有3个复选框的菜单:“ menuRefreshFast”,“ menuRefreshMedium”和“ menuRefreshSlow”。

          <controls:MenuItem Header="UI" FontFamily="Microsoft Sans Serif" TabIndex="103">
                <CheckBox x:Name="menuRefreshFast" Content="Fast"></CheckBox>
                <MenuFlyoutSubItem x:Name="menuRefresh" Text="Refresh Rate">
                    <MenuFlyoutItem>
                        <MenuFlyoutItem.Template>
                            <ControlTemplate TargetType="MenuFlyoutItem">
                                <CheckBox x:Name="menuRefreshFast" Content="Fast (250ms)" Click="menuRefreshFast_Click" Tag="menuRefreshFast"/>
                            </ControlTemplate>
                        </MenuFlyoutItem.Template>
                    </MenuFlyoutItem>
                    <MenuFlyoutItem>
                        <MenuFlyoutItem.Template>
                            <ControlTemplate TargetType="MenuFlyoutItem">
                                <CheckBox x:Name="menuRefreshMedium" Content="Medium (500ms)" Click="menuRefreshMedium_Click" Tag="menuRefreshMedium"/>
                            </ControlTemplate>
                        </MenuFlyoutItem.Template>
                    </MenuFlyoutItem>
                    <MenuFlyoutItem>
                        <MenuFlyoutItem.Template>
                            <ControlTemplate TargetType="MenuFlyoutItem">
                                <CheckBox x:Name="menuRefreshSlow" Content="Slow (1s)" Click="menuRefreshSlow_Click" Tag="menuRefreshSlow"/>
                            </ControlTemplate>
                        </MenuFlyoutItem.Template>
                    </MenuFlyoutItem>
                </MenuFlyoutSubItem>
            </controls:MenuItem>

当我加载应用程序时,我可以看到GUI做正确的事。但是,当我尝试使用x:Name引用这些复选框时,无法识别它们!有人可以向我解释原因吗?

screenshot: Code-behind doesn't recognize the Checkboxes

2 个答案:

答案 0 :(得分:0)

我不是这样做的,因此可以直接访问ControlTemplate中的项目,但是作为一个简单的解决方案,您可以做的是,在CheckBox的加载事件中,可以将该对象保存如下:

<CheckBox x:Name="menuRefreshFast" Content="Fast (250ms)" Click="menuRefreshFast_Click" Tag="menuRefreshFast" Loaded="menuRefreshFast_Loaded"/>

private CheckBox menuRefreshFast;
private void menuRefreshFast_Loaded(object sender, RoutedEventArgs e)
{
   menuRefreshFast = sender as CheckBox;
}

答案 1 :(得分:0)

您不能直接使用控件名称从后面的页面代码访问XAML ControlTemplate中的控件。 ControlTemplate定义了用作控件的控件模板的元素树,其子元素不会显示在您的页面上,因此您无法从后面的页面代码中访问它。通常,我们使用VisualTreeHelper类,您可以从Internet上找到有关它的更多信息。在这种情况下,您还可以使用@Dishant中的方法来获取CheckBox。

但是,如果要使所选项目互斥,我建议您使用Radio buttons,可以对单选按钮进行分组,以使用户只能在单选按钮组中选择一个单选按钮。请参见Create a radio button部分,以使“单选”按钮成组工作。

这是基于您上面的代码的示例代码。

        <controls:Menu>
            <controls:MenuItem Header="UI" FontFamily="Microsoft Sans Serif" TabIndex="103">
                <CheckBox x:Name="menuRefreshFast" Content="Fast"></CheckBox>
                <MenuFlyoutSubItem x:Name="menuRefresh" Text="Refresh Rate">
                    <MenuFlyoutItem>
                        <MenuFlyoutItem.Template>
                            <ControlTemplate TargetType="MenuFlyoutItem">
                                <RadioButton x:Name="menuRefreshFast" GroupName="MyGroup" Content="Fast (250ms)" Click="menuRefreshFast_Click" Tag="menuRefreshFast"/>
                            </ControlTemplate>
                        </MenuFlyoutItem.Template>
                    </MenuFlyoutItem>
                    <MenuFlyoutItem>
                        <MenuFlyoutItem.Template>
                            <ControlTemplate TargetType="MenuFlyoutItem">
                                <RadioButton x:Name="menuRefreshMedium"  GroupName="MyGroup" Content="Medium (500ms)" Click="menuRefreshMedium_Click" Tag="menuRefreshMedium"/>
                            </ControlTemplate>
                        </MenuFlyoutItem.Template>
                    </MenuFlyoutItem>
                    <MenuFlyoutItem>
                        <MenuFlyoutItem.Template>
                            <ControlTemplate TargetType="MenuFlyoutItem">
                                <RadioButton x:Name="menuRefreshSlow"  GroupName="MyGroup" Content="Slow (1s)" Click="menuRefreshSlow_Click" Tag="menuRefreshSlow"/>
                            </ControlTemplate>
                        </MenuFlyoutItem.Template>
                    </MenuFlyoutItem>
                </MenuFlyoutSubItem>
            </controls:MenuItem>
        </controls:Menu>