gpt4 book ai didi

silverlight - UserControl 的内容属性内的命名控件在运行时始终显示为 null

转载 作者:行者123 更新时间:2023-12-04 12:13:38 25 4
gpt4 key购买 nike

我创建了一个用户控件,可重复用于不同目的。我已经定义了一个包含 UIElement 的依赖属性,我将其显示为用户控件中某个区域的内容。

我注意到当我使用这个控件时。并为内容属性内的元素命名,它们在运行时始终显示为空。

我的容器.xaml:

<UserControl x:Class="BSSApp.UI.Tests.MyContainer" x:Name="userControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Border x:Name="LayoutRoot" Background="Green" CornerRadius="20" BorderBrush="#005500" BorderThickness="10">
<ContentPresenter Content="{Binding ElementName=userControl, Path=MyContent}" Margin="20"/>

</Border>
</UserControl>

我的容器.xaml.cs
namespace BSSApp.UI.Tests
{
public partial class MyContainer : UserControl
{
public static readonly DependencyProperty MyContentProperty =
DependencyProperty.Register("MyContent",
typeof(UIElement),
typeof(MyContainer),
new PropertyMetadata(new Grid()));

public UIElement MyContent
{
get
{
return (UIElement)GetValue(MyContentProperty);
}
set
{
SetValue(MyContentProperty, value);
}
}


public MyContainer()
{
InitializeComponent();
}
}
}

和使用类:
UserControlContentBug.xaml:
<UserControl x:Class="BSSApp.UI.Tests.UserControlContentBug"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:t="clr-namespace:BSSApp.UI.Tests"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">

<Grid x:Name="LayoutRoot" Background="White">
<t:MyContainer>
<t:MyContainer.MyContent>
<Button Name="btnWithName" Click="btnWithName_Click">Click Me</Button>
</t:MyContainer.MyContent>
</t:MyContainer>
</Grid>
</UserControl>

以及背后的代码:
UserControlContentBug.xaml.cs
 namespace BSSApp.UI.Tests
{
public partial class UserControlContentBug : UserControl
{
public UserControlContentBug()
{
InitializeComponent();
}

private void btnWithName_Click(object sender, RoutedEventArgs e)
{
// this throws an exception
btnWithName.Tag=2;
}
}
}

所以有一个按钮声明,名为“btnWithName”。该变量确实是在后面的代码中声明的,但它保持为空......它只发生在按钮在另一个用户控件的属性内声明时。

有谁知道如何解决这个问题?

谢谢

最佳答案

我自己刚刚遇到了这个问题。生成的部分类(例如,obj\UserControlContentBug.xaml.g.cs)定义了 XAML 中代码可访问的命名元素使用 FrameworkElement.FindName()完成这些任务。

根据 MSDN:

A run-time API such as FindName is working against an object tree. These objects are loaded into the content area and the CLR runtime engine of the overall Silverlight plug-in. When part of the object tree is created from templates or run-time loaded XAML, a XAML namescope is typically not contiguous with the entirety of that object tree. The result is that there might be a named object in the object tree that a given FindName call cannot find.



由于 MyContainer 建立自己的名称范围边界作为 UserControl,从 UserControlContentBug 调用 FindName() 将不会探索对象树的那部分(其中
btnWithName 已定义)。

可能有几种不同的方法可以解决这个问题,但对我有用的最简单的方法是:
  • 为 MyContainer 命名( x:Name="myContainer" )。
  • 从按钮 (btnWithName) 中删除名称,以便在生成的 C# 代码中不会保留同名的多余的、始终为空的变量。
  • 在代码隐藏中创建对 Button 的引用。

  • 像这样:
    namespace BSSApp.UI.Tests
    {
    public partial class UserControlContentBug : UserControl
    {
    private Button btnWithName;

    public UserControlContentBug()
    {
    Loaded += UserControlContentBugLoaded;
    InitializeComponent();
    }

    private void UserControlContentBugLoaded(object sender, System.Windows.RoutedEventArgs e)
    {
    btnWithName = myContainer.MyContent as Button;
    }

    private void btnWithName_Click(object sender, RoutedEventArgs e)
    {
    // this throws an exception, not so much
    btnWithName.Tag=2;
    }
    }
    }

    希望这可以帮助。

    关于silverlight - UserControl 的内容属性内的命名控件在运行时始终显示为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5670833/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com