Я провел весь вечер, пытаясь понять и устранить проблему, с которой я сейчас сталкиваюсь на панели инструментов:
Я создал крошечную векторную программу для рисования, в которой пользователь может выбратьинструмент (выделение, линия, текст, изображение и т. д.), щелкнув соответствующий значок на панели инструментов перед его использованием.
Когда выбран определенный инструмент, на панели инструментов появляются новые элементы управления(у них есть видимость, которая изначально установлена как свернутая, измененная на видимую), позволяющая пользователю изменять его параметры.
Например, при нажатии на инструмент ввода текста появляется поле, в которое пользователь может записатьсодержание.Когда инструмент изображения выбран, появляется кнопка, которая открывает OpenFileDialog (для выбора исходного файла) и т. Д. И т. Д.
Проблема заключается в том, что в очень конкретной ситуации некоторые элементы, которые должныпоявляются, когда выбран соответствующий инструмент, остаются скрытыми, даже если их видимость установлена в true в коде.И отсутствующие элементы управления также не находятся в переполненной части панели инструментов.
Это довольно сложно объяснить, поэтому вот пример исходного кода, который имитирует мое приложение и показывает проблему: создайте новый проект C # wpf,затем скопируйте следующий код в MainWindow.xaml
<Window x:Class="DDI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DDI" Height="250" Width="318">
<DockPanel Width="Auto" Height="Auto" LastChildFill="True">
<StackPanel DockPanel.Dock="Top" ToolBarTray.IsLocked="True">
<Menu>
<MenuItem Header="Fichier">
<MenuItem Header="Nouveau" />
<MenuItem Header="Ouvrir" />
<Separator />
<MenuItem Header="Quitter" />
</MenuItem>
</Menu>
<ToolBar Name="toolbar">
<ToggleButton Name="tool_selection" Height="16" Width="16" Click="tool_selection_Click" Background="Yellow">
</ToggleButton>
<ToggleButton Name="tool_text" Height="16" Width="16" Click="tool_text_Click" Background="Red">
</ToggleButton>
<ToggleButton Name="tool_image" Height="16" Width="16" Click="tool_image_Click" Background="Blue">
</ToggleButton>
<Separator Name="tool_separator1" Margin="4,2" />
<TextBlock Name="tool_name_caption" VerticalAlignment="Center" Margin="0,0,4,0" Visibility="Collapsed">
Name :
</TextBlock>
<TextBox Name="tool_name_field" Width="80" BorderBrush="#FF6F6F6F" Visibility="Collapsed">
</TextBox>
<TextBlock Name="tool_content_caption" VerticalAlignment="Center" Margin="4,0,4,0" Visibility="Collapsed">
Content :
</TextBlock>
<TextBox Name="tool_content_field" Width="100" BorderBrush="#FF6F6F6F" Visibility="Collapsed">
Your text
</TextBox>
<TextBlock Name="tool_source_caption" VerticalAlignment="Center" Margin="4,0,4,0" Visibility="Collapsed">
Source :
</TextBlock>
<TextBox Name="tool_source_field" Width="80" BorderBrush="#FF6F6F6F" IsReadOnly="True" AllowDrop="False" Visibility="Collapsed">
</TextBox>
<Button Name="tool_source_select" BorderBrush="#FF6F6F6F" Visibility="Collapsed">
...
</Button>
<TextBlock Name="tool_z_caption" VerticalAlignment="Center" Margin="4,0,4,0" Visibility="Collapsed">
Z :
</TextBlock>
<TextBox Name="tool_z_field" Width="30" BorderBrush="#FF6F6F6F" Visibility="Collapsed">
0
</TextBox>
</ToolBar>
</StackPanel>
<ScrollViewer HorizontalScrollBarVisibility="Visible">
<Canvas Name="workspace" Background="White">
</Canvas>
</ScrollViewer>
</DockPanel>
и следующие строки в соответствующем файле * .cs:
using System.Windows;
namespace DDI
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
SelectSelectionTool();
}
private void tool_selection_Click(object sender, RoutedEventArgs e)
{
SelectSelectionTool();
}
private void tool_text_Click(object sender, RoutedEventArgs e)
{
SelectTextTool();
}
private void tool_image_Click(object sender, RoutedEventArgs e)
{
SelectImageTool();
}
private void SelectSelectionTool()
{
tool_selection.IsChecked = true;
tool_text.IsChecked = false;
tool_image.IsChecked = false;
tool_separator1.Visibility = Visibility.Collapsed;
tool_name_caption.Visibility = Visibility.Collapsed;
tool_name_field.Visibility = Visibility.Collapsed;
tool_content_caption.Visibility = Visibility.Collapsed;
tool_content_field.Visibility = Visibility.Collapsed;
tool_source_caption.Visibility = Visibility.Collapsed;
tool_source_field.Visibility = Visibility.Collapsed;
tool_source_select.Visibility = Visibility.Collapsed;
tool_z_caption.Visibility = Visibility.Collapsed;
tool_z_field.Visibility = Visibility.Collapsed;
}
private void SelectTextTool()
{
tool_selection.IsChecked = false;
tool_text.IsChecked = true;
tool_image.IsChecked = false;
tool_separator1.Visibility = Visibility.Visible;
tool_name_caption.Visibility = Visibility.Visible;
tool_name_field.Visibility = Visibility.Visible;
tool_content_caption.Visibility = Visibility.Visible;
tool_content_field.Visibility = Visibility.Visible;
tool_source_caption.Visibility = Visibility.Collapsed;
tool_source_field.Visibility = Visibility.Collapsed;
tool_source_select.Visibility = Visibility.Collapsed;
tool_z_caption.Visibility = Visibility.Visible;
tool_z_field.Visibility = Visibility.Visible;
}
private void SelectImageTool()
{
tool_selection.IsChecked = false;
tool_text.IsChecked = false;
tool_image.IsChecked = true;
tool_separator1.Visibility = Visibility.Visible;
tool_name_caption.Visibility = Visibility.Visible;
tool_name_field.Visibility = Visibility.Visible;
tool_content_caption.Visibility = Visibility.Collapsed;
tool_content_field.Visibility = Visibility.Collapsed;
tool_source_caption.Visibility = Visibility.Visible;
tool_source_field.Visibility = Visibility.Visible;
tool_source_select.Visibility = Visibility.Visible;
tool_z_caption.Visibility = Visibility.Visible;
tool_z_field.Visibility = Visibility.Visible;
}
}
}
Теперь запустите приложение,Не пытайтесь изменить его размер сейчас, чтобы увидеть проблему!
Желтый инструмент - тот, который выбран в данный момент.Теперь действуйте в следующем порядке: нажмите на красную кнопку: появятся новые элементы.Нажмите на синюю кнопку: некоторые элементы остаются, некоторые исчезают.Но, как ни странно, некоторые из них отсутствуют: TexBlock "Source:", текстовое поле tool_source_file и кнопка "...".Попробуйте изменить размер окна: три отсутствующих элемента управления отображаются по волшебству (их не было в переполненной части панели инструментов, которая раньше не была активной)
Другой способ увидеть проблему:
- Запустите приложение.
- В данный момент выбран желтый инструмент.
- Нажмите на красную кнопку.
- Нажмите на синюю кнопку.
- Нажмите на красную кнопку.
- Нажмите на синюю кнопку: три недостающих элемента управления теперь отображаются в нужном месте!
Мой вопрос прост: что происходит?
Я пробовал много вещей, включая использование другой версии инвалидации с панелью инструментов после изменения видимости элементов, разбиение панели инструментов на две панели и т. Д., Но ничего не получалось.
Спасибо за ваши ответы.
Я скоро попробую ваш код, Тони.
Я также поставил вопрос на веб-сайте Microsoft, но, видимо, они не рассматривают предложения, если только ониполучить 5 голосов.Поэтому, пожалуйста, проголосуйте за это: https://connect.microsoft.com/WPF/feedback/details/638552/changing-visibility-of-toolbar-components-to-visible-does-not-make-them-appear-event-in-the-overflow-part-of-the-toolbar#details
С уважением