การเปลี่ยนองค์ประกอบของแถบเครื่องมือจากแบบยุบเป็นแบบมองเห็นได้จะไม่เปลี่ยนการมองเห็น

ฉันใช้เวลาทั้งเย็นเพื่อพยายามทำความเข้าใจและแก้ไขปัญหาที่ฉันกำลังประสบกับแถบเครื่องมืออยู่ในขณะนี้ :

ฉันได้สร้างโปรแกรมวาดภาพแบบเวกเตอร์เล็กๆ ซึ่งผู้ใช้สามารถเลือกเครื่องมือได้ (การเลือก เส้น ข้อความ รูปภาพ ฯลฯ...) โดยการคลิกที่ไอคอนที่เกี่ยวข้องซึ่งอยู่ในแถบเครื่องมือก่อนใช้งาน

เมื่อเลือกเครื่องมือบางอย่าง การควบคุมใหม่จะปรากฏในแถบเครื่องมือ (มีการมองเห็น ซึ่งเดิมตั้งค่าให้ยุบ เปลี่ยนเป็นมองเห็นได้) ทำให้ผู้ใช้สามารถเปลี่ยนพารามิเตอร์ได้

ตัวอย่างเช่น เมื่อคลิกที่เครื่องมือข้อความ ช่องจะปรากฏขึ้นเพื่อให้ผู้ใช้สามารถเขียนเนื้อหาได้ เมื่อเลือกเครื่องมือรูปภาพ ปุ่มจะปรากฏขึ้นเพื่อเปิด OpenFileDialog (เพื่อเลือกไฟล์ต้นฉบับ) ฯลฯ ฯลฯ...

ปัญหาคือว่า ในสถานการณ์เฉพาะ องค์ประกอบบางอย่างที่ควรปรากฏขึ้นเมื่อเลือกเครื่องมือที่เกี่ยวข้องนั้นถูกซ่อนไว้ แม้ว่าจะถูกตั้งค่าการมองเห็นให้เป็นจริงในโค้ดก็ตาม และตัวควบคุมที่ขาดหายไปก็ไม่ได้อยู่ในส่วนโอเวอร์โฟลว์ของแถบเครื่องมือเช่นกัน

ค่อนข้างอธิบายยาก นี่คือตัวอย่างซอร์สโค้ดซึ่งเลียนแบบแอปของฉันและแสดงปัญหา : สร้างโปรเจ็กต์ 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>

And the following lines in the corresponding *.cs file :

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, กล่องข้อความ tool_source_file และปุ่ม "..." ลองปรับขนาดหน้าต่าง : ตัวควบคุมที่ขาดหายไปทั้งสามปรากฏขึ้นมาด้วยเวทย์มนตร์ (ไม่มีอยู่ในส่วนที่ล้นของแถบเครื่องมือ ซึ่งไม่ได้ใช้งานมาก่อน)

อีกวิธีในการดูปัญหา:

  • เปิดแอป
  • เครื่องมือสีเหลืองคือเครื่องมือที่เลือกอยู่ในปัจจุบัน
  • คลิกที่ปุ่มสีแดง
  • คลิกที่ปุ่มสีน้ำเงิน
  • คลิกที่ปุ่มสีแดง
  • คลิกที่ปุ่มสีน้ำเงิน : ตอนนี้ตัวควบคุมที่ขาดหายไปสามตัวปรากฏขึ้นในตำแหน่งที่ถูกต้อง!

คำถามของฉันง่าย ๆ : เกิดอะไรขึ้น?

ฉันได้ลองหลายอย่างแล้ว รวมถึงการใช้เวอร์ชันที่แตกต่างกันของ invalidate กับแถบเครื่องมือหลังจากเปลี่ยนการมองเห็นรายการ การแยกแถบเครื่องมือออกเป็นสองแผง ฯลฯ แต่ก็ไม่ได้ผล


ขอบคุณสำหรับคำตอบของคุณ

ฉันจะลองใช้รหัสของคุณในไม่ช้าโทนี่

ฉันได้ส่งปัญหาบนเว็บไซต์ Microsoft แล้ว แต่ดูเหมือนว่าพวกเขาไม่ได้ดูคำแนะนำเว้นแต่ว่าพวกเขาจะได้รับ 5 โหวต ดังนั้นโปรดลงคะแนนให้: https://connect.microsoft.com/WPF/feedback/details/638552/changing-visibility-of-toolbar-components-to-visible-does-not-make-พวกเขาปรากฏ-เหตุการณ์-in-the-overflow-part-of-the-toolbar#details

ความนับถือ


person thomasc    schedule 25.01.2011    source แหล่งที่มา
comment
ฉันทำซ้ำสิ่งนี้ซึ่งดูเหมือนว่าจะเป็นข้อบกพร่องในคอมพิวเตอร์ของฉัน (Win7, .Net 4 SP1 Beta) มันแปลกจริงๆ. คุณสามารถส่งรหัสและคำอธิบายของคุณไปที่ connect.microsoft.com บางทีพวกเขาจะชี้ทิศทางหรือตรวจพบข้อบกพร่อง และลองรวมการแก้ไขไว้ใน .Net 4 Final SP1   -  person Tony    schedule 26.01.2011
comment
ใช่แล้ว ดูเหมือนแมลงอย่างแน่นอน   -  person Robert Levy    schedule 26.01.2011


คำตอบ (1)


ฉันไม่รู้ แต่ดูเหมือนว่าจะเป็นข้อบกพร่อง ในตอนนี้ คุณสามารถลองทำสิ่งนี้เพื่อแก้ไขปัญหาของคุณได้:

    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() เป็นวิธีส่วนขยายที่ฉันใช้ในโครงการของฉัน:

// 05-01-2010
public static class WPFUIRefreshExtensionMethods
{
    // www.tonysistemas.com.br
    private static System.Action EmptyDelegate = delegate() { };

    /// <summary>
    /// Força redesenhar
    /// mesmo que esteja dentro de um loop
    /// </summary>
    /// <param name="uiElement"></param>
    public static void Refresh(this System.Windows.UIElement uiElement)
    {
        //uiElement.UpdateLayout();
        uiElement.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Render, EmptyDelegate);
    }
}
person Tony    schedule 26.01.2011