【问题标题】:Disappearing Resource Controls?消失的资源控制?
【发布时间】:2013-11-12 11:03:06
【问题描述】:

在我的 WPF 应用程序中,我有一个带有一些控件的 ResourceDictionary

<ResourceDictionary>
    <Border x:Key="SystemBorder">
        <!-- SomeContent -->
    </Border>

    <Border x:Key="DateBorder">
        <!-- SomeContent -->
    </Border>

    <Button x:Key="QuitButton">
        <!-- SomeContent -->
    </Button>
</ResourceDictionary>

现在在我的窗口中,我有一个 TabControl 和一些 TabItem,在控件正在使用的每个 TabItem 内。
但是当我更改选项卡时一切都很好,但是当我更改回选项卡时,这些控件将不存在。

我尝试使用x:Shared="False",但没有任何区别。
我该如何解决这个问题?

编辑:
每个 TabItem 都有相同的结构:

<TabItem>
    <Grid>
        <Grid.RowDefinitions/>
            <!-- Defs -->
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions/>
            <!-- Defs -->
        </Grid.ColumnDefinitions>
    </Grid>

        <Border x:Name="Menu1" Grid.Row="0" Grid.Column="0">
            <ContentControl x:Name="Date1" Content="{DynamicResource DateBorder}">
            <!-- some Buttons -->
            <ContentControl x:Name="QuitButton1" Content="{DynamicResource QuitButton}"/>
        </Border>
        <!-- some more Borders -->
        <ContentControl x:Name="SystemBorder1" Grid.Row="3" Grid.Column="0" Content="{DynamicResource SystemBorder}"/>
</TabItem>

DateBorder 还有一个线程,每秒更新一次日期。

【问题讨论】:

  • 所以,它们在那里,然后消失了?
  • 标签如何使用这些资源?您应该添加一些代码。但请只关注必要的部分。
  • 好吧,只是不存在,当我返回时它是空白的。我会再编辑一些代码。
  • 添加了一些代码,我的另一个评论很烦人:控件在那里,但只有一个选项卡,其他选项卡只有空白。

标签: wpf xaml tabitem resource-file


【解决方案1】:

如果我打赌,可能是因为边框不能多次出现在视觉树中。

为什么不绑定到一个集合并为选项卡创建一个 DataTemplate:

<DataTemplate x:Key="TabTemplate">
    <Grid>
        <Grid.RowDefinitions/>
            <!-- Defs -->
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions/>
            <!-- Defs -->
        </Grid.ColumnDefinitions>
    </Grid>
    <Border Grid.Row="0" Grid.Column="0">
        <!-- some Menu1-->
        <Border>
            <!-- DateBorder-->
        </Border>
        <Button>
            <!-- QuitButton -->
        </Button>
        </Border>
    </Border>
    <!-- some more Borders -->
    <Border Grid.Row="3" Grid.Column="0" >
        <!-- SomeContent -->
    </Border>
</DataTemplate>

<TabControl ItemSource="{Binding Collection}" ItemTemplate="{StaticResource TabTemplate}" />

【讨论】:

  • 我从来没有使用过 DataTemplates,而且……所以我什至没有这个想法。 TabItems 的内容对于每个 Tab 也是单独的,我需要以编程方式访问内部的大多数控件
  • 在这种情况下,也许您应该只在每个单独的选项卡中定义这些边框/按钮并将其作为资源放弃。或者说我很痛苦……根据您的内容,更改 TabItem 的模板。
  • 同样的代码10次以上,希望能保持代码清晰。
  • 是否可以将它们分解为用户控件?让他们更有条理?
  • 我认为这对于某些控件是可能的,但是我的 DateBorder 又出现了问题,因为线程必须每秒更新它们中的每一个。
【解决方案2】:

我找到了一个带有代码的解决方法,所以我将与您分享:

C#:

private void TabControl_SelectionChanged(sender As Object, e As SelectionChangedEventArgs)
{
    for(int i = 1; i < 4; i++)
    {
        FindName("Date" + i).Content = null;
        FindName("QuitButton" + i).Content = null;
        FindName("SystemBorder" + i).Content = null;
    }

    var tc = (TabControl) sender;
    var index = tc.SelectedIndex + 1;

    FindName("Date" + index).Content = FindResource("DateBorder");
    FindName("QuitButton" + index).Content = FindResource("QuitButton");
    FindName("SystemBorder" + index).Content = FindResource("SystemBorder");
}

VB:

Private Sub TabControl_SelectionChanged(sender As Object, e As SelectionChangedEventArgs)
    For i = 1 To 3
        FindName("Date" & i).Content = Nothing
        FindName("QuitButton" & i).Content = Nothing
        FindName("SystemBorder" & i).Content = Nothing
    Next

    Dim tc = CType(sender, TabControl)
    Dim index = tc.SelectedIndex + 1

    FindName("Date" & index).Content = FindResource("DateBorder")
    FindName("QuitButton" & index).Content = FindResource("QuitButton")
    FindName("SystemBorder" & index).Content = FindResource("SystemBorder")
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    相关资源
    最近更新 更多