Исчезающие средства управления ресурсами?
В моем приложении 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}" />