WPF C#中用户重新连接RDC时如何防止调用Pages和UC的加载卸载方法?

问题描述 投票:0回答:1

在我的 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 
}

重新连接后,命中的第一个断点位于构造函数中,我不知道如何进一步调试它,因为堆栈跟踪仅显示在此之前的[外部代码]。

c# wpf remote-desktop
1个回答
0
投票

一般来说,从代码隐藏向可视化树添加控件通常会导致问题或不必要的复杂代码。这很少是解决方案

在您的情况下,如果您希望

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
内联属性

使用示例1

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>

使用示例2

MainWindow.xaml

<Window>
  <SectionsUserControl>
    <SectionsUserControl.Content>
      <TextBlock Text="This is individual page content that is displayed below the header" />
    </SectionsUserControl.Content>
  </SectionsUserControl>
</Window>
© www.soinside.com 2019 - 2024. All rights reserved.