gpt4 book ai didi

c# - Wrapped RadBusyIndi​​cator 内容中的 UIElements 为空

转载 作者:太空宇宙 更新时间:2023-11-03 15:53:06 25 4
gpt4 key购买 nike

我遇到了一个有趣的 UI 问题。我有一个来自 Telerik 的 RadBusyIndi​​cator 包裹在一个 UserControl 中(如果 Telerik 仍然有内存泄漏,以便于切换到 Windows 忙碌指示器)。当我将内容放入控件中时,如果它在包装控件的开始和结束标记之间具有的不仅仅是 ContentControl,则具有 x:Name 属性的所有内容都是null 在后面的代码中,并在加载页面时导致异常。

这是为了保护无辜者而删除了名称的代码的相似之处。

xaml...

<UserControl>
<Grid x:Name="Indicator">
<telerik:RadBusyIndicator x:Name="BusyIndicator" IsBusy="{Binding Path=IsStatusBusy, Mode=TwoWay}" BusyContent="{Binding Path=WaitingContent, Mode=TwoWay}" Content="{Binding Path=UserContent, Mode=TwoWay}"/>
</Grid>
</UserControl>

以及背后的代码……

[ContentProperty("UserContent")]
public partial class CustomBusyIndicator : UserControl
{
public CustomBusyIndicator()
{
InitializeComponent();
Indicator.DataContext = this;
}

public UIElement UserContent
{
get { return (UIElement)GetValue(UserContentProperty); }
set { SetValue(UserContentProperty, value); }
}

private static readonly DependencyProperty UserContentProperty = DependencyProperty.Register("PageContent",
typeof(UIElement), typeof(CustomBusyIndicator), new PropertyMetadata(null));

private static readonly DependencyProperty WaitingContentProperty = DependencyProperty.Register("WaitingContent",
typeof (object), typeof (CustomBusyIndicator), new PropertyMetadata(null, OnWaitingContentChanged));

private static void OnWaitingContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{}

private static readonly DependencyProperty IsStatusBusyProperty = DependencyProperty.Register("IsStatusBusy",
typeof (bool), typeof (CustomBusyIndicator), new PropertyMetadata(false, OnIsStatusBusyChanged));

private static void OnIsStatusBusyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{}


public bool IsStatusBusy
{
get { return (bool) GetValue(IsStatusBusyProperty); }
set { SetValue(IsStatusBusyProperty, value); }
}

public object WaitingContent
{
get { return GetValue(WaitingContentProperty); }
set { SetValue(WaitingContentProperty, value); }
}
}

我就是这样使用它的......

<CustomBusyIndicator IsStatus={Binding IsBusy}>
<CustomBusyIndicator.WaitingContent>
<TextBlock Text="Loading..." Foreground="Black" />
</CustomBusyIndicator.WaitingContent>
<Grid>
.
.
.
.
</Grid>
</CustomBusyIndicator>

有什么想法吗?预先感谢您的帮助!

编辑

我现在确定似乎是 x:Name 导致了问题。 InitializeComponent() 调用后的代码中为空。

最佳答案

您是从 UserControl 派生的,那么会发生什么......让我们看看:

您的类继承了一个名为 Content 的公共(public)属性,这个属性正是基类的专用 ContentProperty,由 [ContentProperty("Content ")] 在基类级别。

这就是为什么通常您在 userControl 定义的 xaml 部分中声明的所有内容在加载时都会显示的原因。所以当你看到这个...

<UserControl ... >
<Grid x:Name="Indicator">
<telerik:RadBusyIndicator x:Name="BusyIndicator" ... />
</Grid>
</UserControl>

它在技术上与编写此代码相同:

<UserControl ... >
<UserControl.Content>
<Grid x:Name="Indicator">
<telerik:RadBusyIndicator x:Name="BusyIndicator" ... />
</Grid>
</UserControl.Content>
</UserControl>

这意味着每当您在 xaml 中的某处使用 UserControl 并按照您的方式添加内容时...

<CustomBusyIndicator ...>
<Grid> ... </Grid>
</CustomBusyIndicator>

...您正在覆盖在 UserControl 定义的 xaml 部分内声明的所有内容(您将另一个属性注释为 ContentProperty 并不重要,这仅意味着您设置了两次新的 ContentProperty)。

那么你现在有什么选择:

选项编号 1:将 UserControl 保留为您的基础,但仅显式使用您的属性 UserContent所以用法看起来像这样:

<CustomBusyIndicator ...>
<CustomBusyIndicator.UserContent>
<Grid> ... </Grid>
</CustomBusyIndicator.UserContent>
</CustomBusyIndicator>

选项编号 2:从 ControlContentControl 派生并将您的 UserControl 的 xaml 部分转换为默认的 ControlTemplate这样你就可以像这样使用它了

<CustomBusyIndicator ...>
<Grid> ... </Grid>
</CustomBusyIndicator>

但是您必须确保在解析 xaml 时找到您的模板。我通常会执行以下操作:

  • 创建 ResourceDictionary CustomBusyIndi​​cator.xaml
  • themes/generic.xaml 添加一个包含字典的条目
  • DefaultStyleKey = typeof(CustomBusyIndi​​cator); 添加到控件的构造函数中
  • 向 CustomBusyIndi​​cator.xaml 添加隐式样式

这还有另一个分支。您不能像以前那样轻松地使用命名元素:您必须为 OnApplyTemplate 编写覆盖,并通过 GetTemplateChild("BusyIndi​​cator") as RadBusyIndi​​cator; 获取对这些命名元素的引用;

选项编号 3:将 UserControl 保留为您的基础,将 UserContent 保留为 ContentProperty,但显式设置 xaml 部分所以定义看起来像这样:

<UserControl ... >
<UserControl.Content>
<Grid x:Name="Indicator">
<telerik:RadBusyIndicator x:Name="BusyIndicator" ... />
</Grid>
</UserControl.Content>
</UserControl>

关于c# - Wrapped RadBusyIndi​​cator 内容中的 UIElements 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24956780/

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