【问题标题】:Possible to reach a x:name inside User Control Xaml file from Main.xaml.cs可以从 Main.xaml.cs 到达用户控制 Xaml 文件中的 x:name
【发布时间】:2018-11-08 22:04:52
【问题描述】:

我的到达有问题,我想做的是我想到达位于我的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 文件和名为 TemplateGrid.xamlUserControl 两个文件都有一个代码隐藏文件(Main.xaml.csTemplateGrid.xaml.cs

所以只是为了简化....我想从Main.xaml.cs 到达TemplateGrid.xaml 内的X:name。

提前致谢!

编辑:

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

<GridView x:Name="GridView1" ItemContainerStyle="{StaticResource testGrid}" ItemsSource="{x:Bind testValue}" Width="1740" Height="835" IsHitTestVisible="False" ScrollViewer.HorizontalScrollBarVisibility="Hidden" Margin="75,190,75,100" FontFamily="Segoe MDL2 Assets" IsDoubleTapEnabled="False" IsHoldingEnabled="False" IsRightTapEnabled="False" IsTapEnabled="False">
    <GridView.ItemTemplate>
       <DataTemplate x:DataType="data:Room">
           <local:TemplateGrid x:Name="TemplateGridControl"/>
       </DataTemplate>
     </GridView.ItemTemplate>
</GridView>

【问题讨论】:

标签: c# xaml uwp


【解决方案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 中,所以您一次只能从selected GridView 项目中获取Rectangle 实例。

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

【讨论】:

  • 当我尝试您的解决方案时,我收到此错误 System.NullReferenceException: 'Object reference not set to an instance of an object.'
  • 我不太确定你的回答是什么意思......但非常感谢你的帮助:)
【解决方案2】:

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

public Rectangle StatusColorProperty => StatusColor;

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

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

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

默认情况下,Usercontrol 中的控件是“Private”,因此您需要创建一个公共属性,将控件公开给外部环境。

【讨论】:

  • 好吧,现在你的回答中有一点我不明白,那就是当你说我应该在Main.xaml 中设置属性名称时,我应该在哪里设置,矩形@987654329 @ 位于 TemplateGrid 中
  • 在 Main.xaml 中添加用户控件时,可以在 XAML 代码中设置用户控件的属性。 &lt;local:TemplateGridControl x:Name="TemplateGridControl" HorizontalAlignment="Left" Height="147" Margin="46,95,0,0" VerticalAlignment="Top" Width="395"/&gt;
  • 检查编辑。你是这个意思吗?因为我无法在我的Main.xaml.cs 中访问TemplateGridControl
  • 我检查了你的新编辑版本,这就是我所说的。您已经完成了那部分。因此,您只需在TemplateGrid.xaml.cs 中添加一个公共属性,并在Main.xaml.cs 中添加代码,如答案中所述。请忽略Main.xaml 部分
  • 好吧,但是你设置StatusColorProperty.Fill = Brushes.Red的部分我无法到达Brushes...它有什么用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多