- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我遇到了一个有趣的 UI 问题。我有一个来自 Telerik 的 RadBusyIndicator
包裹在一个 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:从 Control
或 ContentControl
派生并将您的 UserControl 的 xaml 部分转换为默认的 ControlTemplate这样你就可以像这样使用它了
<CustomBusyIndicator ...>
<Grid> ... </Grid>
</CustomBusyIndicator>
但是您必须确保在解析 xaml 时找到您的模板。我通常会执行以下操作:
CustomBusyIndicator.xaml
themes/generic.xaml
添加一个包含字典的条目DefaultStyleKey = typeof(CustomBusyIndicator);
添加到控件的构造函数中这还有另一个分支。您不能像以前那样轻松地使用命名元素:您必须为 OnApplyTemplate
编写覆盖,并通过 GetTemplateChild("BusyIndicator") as RadBusyIndicator; 获取对这些命名元素的引用;
选项编号 3:将 UserControl 保留为您的基础,将 UserContent
保留为 ContentProperty,但显式设置 xaml 部分所以定义看起来像这样:
<UserControl ... >
<UserControl.Content>
<Grid x:Name="Indicator">
<telerik:RadBusyIndicator x:Name="BusyIndicator" ... />
</Grid>
</UserControl.Content>
</UserControl>
关于c# - Wrapped RadBusyIndicator 内容中的 UIElements 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24956780/
我是一名优秀的程序员,十分优秀!