Изменение элементов панели инструментов со свернутых на видимые не меняет их видимость - PullRequest
2 голосов
/ 26 января 2011

Я провел весь вечер, пытаясь понять и устранить проблему, с которой я сейчас сталкиваюсь на панели инструментов:

Я создал крошечную векторную программу для рисования, в которой пользователь может выбратьинструмент (выделение, линия, текст, изображение и т. д.), щелкнув соответствующий значок на панели инструментов перед его использованием.

Когда выбран определенный инструмент, на панели инструментов появляются новые элементы управления(у них есть видимость, которая изначально установлена ​​как свернутая, измененная на видимую), позволяющая пользователю изменять его параметры.

Например, при нажатии на инструмент ввода текста появляется поле, в которое пользователь может записатьсодержание.Когда инструмент изображения выбран, появляется кнопка, которая открывает 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

С уважением

1 Ответ

2 голосов
/ 26 января 2011

Не знаю, но это похоже на ошибку.Пока вы можете попытаться сделать это, чтобы решить вашу проблему:

    private void tool_image_Click(object sender, RoutedEventArgs e)
    {
        SelectImageTool();
        ChangeWidthAndRefresh();  // this call will hopefully make the toolbar to show the correct controls... :)
    }


    // temp workaround for a weird bug. 
    void ChangeWidthAndRefresh()
    {
        var old_Width = this.Width;
        this.Width = old_Width - 1;
        this.Refresh();
        this.Width = old_Width;
        this.Refresh();
    }

Примечание. Метод Refresh () - это метод расширения, который я использую в своих проектах:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...