Исчезающие средства управления ресурсами?

В моем приложении 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 также имеет поток, который обновляет дату каждую секунду.

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

Если бы я сделал ставку, это, вероятно, потому что границы не могут быть в визуальном дереве несколько раз.

Почему бы вам не привязать коллекцию и не создать 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}" />
Другие вопросы по тегам