可以从Main.xaml.cs到达User Control Xaml文件中的x:name

时间:2018-05-30 06:52:34

标签: c# xaml uwp

我遇到了问题,我想要做的是我想要到达位于我的UserControl中的这个矩形:

<Rectangle x:Name="StatusColor" Margin="0,0,0,0" Height="218" VerticalAlignment="Top">
     <Rectangle.Fill>
         <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
              <GradientStop Color="#00000000" Offset="0.901"/>
              <GradientStop Color="#CC17FF00" Offset="0"/>
         </LinearGradientBrush>
     </Rectangle.Fill>
</Rectangle>

并且可以在我的Main.xaml.cs中调用它,例如:

StatusColor.Fill = RedBrush;

现在我收到的错误是:

  

当前上下文中不存在名称“StatusColor”

我有两个名为Main.xaml的Xaml文件和名为UserControl的{​​{1}}两个文件,其中一个代码隐藏在文件后面(TemplateGrid.xamlMain.xaml.cs)< / p>

所以只是为了简化....我想从TemplateGrid.xaml.csTemplateGrid.xaml内的X:名称。

提前致谢!

编辑:

这是我在Main.xaml.cs内声明UserControl的地方:

Main.xaml

2 个答案:

答案 0 :(得分:1)

使用此VisualTreeHelper查找您的控件:

private DependencyObject FindChildControl<T>(DependencyObject control, string ctrlName)
{
    int childNumber = VisualTreeHelper.GetChildrenCount(control);
    for (int i = 0; i < childNumber; i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(control, i);
        FrameworkElement fe = child as FrameworkElement;
        // Not a framework element or is null
        if (fe == null) return null;

        if (child is T && fe.Name == ctrlName)
        {
            // Found the control so return
            return child;
        }
        else
        {
            // Not found it - search children
            DependencyObject nextLevel = FindChildControl<T>(child, ctrlName);
            if (nextLevel != null)
                return nextLevel;
        }
    }
    return null;
}

因为UserControl包含DataTemplate所以,您一次只能从选中 Rectangle项中获得GridView个实例

 Rectangle Rec = FindChildControl<Rectangle>(GridView1.SelectedItem, "StatusColor") as Rectangle;

答案 1 :(得分:0)

TemplateGrid.xaml.cs中创建一个新属性,如下所示。

public Rectangle StatusColorProperty => StatusColor;

Main.xaml中添加Usercontrol时,为添加的用户控件(x:Name ="TemplateGridControl")设置属性名称(TemplateGrid)。

Main.xaml.cs中,只要您想访问StatusColor,就可以执行以下操作: -

TemplateGrid control = TemplateGridControl;
control.StatusColorProperty.Fill = Brushes.Red;

默认情况下,Usercontrol中的控件将是&#34; Private&#34; ,因此您需要创建一个公共属性,将控件暴露给外部环境。