在我的 WPF 应用程序中,我有很多 UC 和控件,我想阻止它们在用户重新连接 rdc 后加载和卸载 我做了很多研究来解决这个问题,但没有任何效果。
重新连接到远程桌面会话时会发生这种情况。
控制卸载然后重新加载
DataTemplates 中的控件已完成重新创建 有没有办法防止控件的加载和卸载
我的应用程序在 .NET Framework 版本 4.6 上运行
这是我的代码
public uc()
{
uc.Loaded +=somemethod;
}
somemethod(){
TextBox tb = new TextBox();
this.AddChild(tb); // after getting called again it adds another textbox
}
重新连接后,命中的第一个断点位于构造函数中,我不知道如何进一步调试它,因为堆栈跟踪仅显示在此之前的[外部代码]。
一般来说,从代码隐藏向可视化树添加控件通常会导致问题或不必要的复杂代码。这很少是解决方案
在您的情况下,如果您希望
UserControl
在其所有实例中提供静态内容和动态内容,您应该覆盖默认的 ControlTemplate
。
ControlTemplate
包含静态内容(当然它可以绑定到UserControl
的属性)。但是 UserControl
的客户端无法修改它(不覆盖 ControlTemplate
)。客户端通过设置 UserControl.Content
属性照常添加内容。
SectionsUserControl.xaml
<UserControl>
<UserControl.Template>
<ControlTemplate TargetType="local:PrintableContentHost">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" /> <!-- Header row -->
<RowDefinition /> <!-- Content row -->
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<TextBlock Text="I'm header content" />
</Grid>
<Grid Grid.Row="1">
<ContentPresenter />
</Grid>
</Grid>
</ControlTemplate>
</UserControl.Template>
</UserControl>
现在您可以在多个页面中使用
SectionsUserControl
,其中标题内容保持不变,仅实际页面内容发生变化。
要提供动态内容,您可以:
示例 1): 定义一个
DataTemplate
并将数据模型分配给 UserControl.Content
(例如 MVVM 上下文中的视图模型类)或
示例 2): 设置
UserControl.Content
内联属性
PageModel.cs
class PageModel : INotifyPropertyChnaged
{
public string PageText => "This is individual page content that is displayed below the header";
}
应用程序.xaml
<ResourceDictionary>
<DataTemplate x:Key="PageContentTemplate"
DataType="{x:Type PageModel}">
<TextBlock Text="{Binding PageText}" />
</DataTemplate>
<ResourceDictionary>
MainWindow.xaml
<Window>
<!--
The ContentTemplate property is explicitly set in this example to
highlight the concept.
If the DataTemplate is implicit (keyless) then the template would be
automatically loaded by WPF.
-->
<SectionsUserControl ContentTemplate="{StaticResource PageContentTemplate}">
<SectionsUserControl.Content> <!-- You can bind the PageModel to the SectionsUserControl.Content property -->
<PageModel />
</SectionsUserControl.Content>
</SectionsUserControl>
</Window>
MainWindow.xaml
<Window>
<SectionsUserControl>
<SectionsUserControl.Content>
<TextBlock Text="This is individual page content that is displayed below the header" />
</SectionsUserControl.Content>
</SectionsUserControl>
</Window>