WPF ToolBar: วิธีลบกริปและล้น


98

ใน WPF ToolBarPanel-ToolBar-Menu ที่ซ้อนกันเราต้องการกำจัดที่จับกริปไปทางซ้ายและพื้นที่ล้นไปทางขวา ทั้งคู่เป็นสีเทา แต่เราไม่ต้องการให้แสดงเลย

ความคิดใด ๆ เกี่ยวกับการทำสิ่งนั้นให้สำเร็จ?

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

รูปภาพของแถบเครื่องมือ


คุณอาจทำได้โดยการเขียนทับเทมเพลตการควบคุม ... แต่ฉันไม่แนะนำให้ทำ
apandit

คุณสามารถใส่ Margin = "0,0, -14,0" บน ToolBar เพื่อดันด้านขวาออกจากมุมมอง นี่เป็นวิธีแก้ปัญหาที่ง่ายที่สุดที่ฉันพบ แต่ฉันได้ทดสอบด้วย ToolBar เดียวที่ไม่ได้อยู่ใน ToolBarPanel หรือ ToolBarTray
Wayne Bloss

คำตอบ:


153

สามารถถอดกริปออกได้โดยการตั้งค่าคุณสมบัติที่แนบToolBarTray.IsLocked="True"บนแถบเครื่องมือ

ในการลบOverflow ToggleButtonคุณจะต้องลบออกใน ControlTemplate ที่กำหนดเองตามที่ sixlettervariables แนะนำซึ่งหากคุณผสมผสานหรือสามารถดาวน์โหลด Blend 3 Preview ได้ก็ไม่ยากเกินไป

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

<ToolBarPanel DockPanel.Dock="Top">
    <ToolBar ToolBarTray.IsLocked="True" Loaded="ToolBar_Loaded">
        <Menu ToolBar.OverflowMode="Never">
            <MenuItem Header="File" />
            <MenuItem Header="New" />
        </Menu>
    </ToolBar>
</ToolBarPanel>

และตั้งค่า Overflow ToggleButton ให้ยุบ:

private void ToolBar_Loaded(object sender, RoutedEventArgs e)
{
    ToolBar toolBar = sender as ToolBar;
    var overflowGrid = toolBar.Template.FindName("OverflowGrid", toolBar) as FrameworkElement;
    if (overflowGrid != null)
    {
        overflowGrid.Visibility = Visibility.Collapsed;
    }
    var mainPanelBorder = toolBar.Template.FindName("MainPanelBorder", toolBar) as FrameworkElement;
    if (mainPanelBorder != null)
    {
        mainPanelBorder.Margin = new Thickness();
    }
}

15
ถามคำถาม: ทำไมต้องใช้ ToolBar เลย? ทำไมไม่ใช้เพียงแค่ StackPanel ธรรมดากับปุ่ม? ToolBar ให้ประโยชน์อะไรบ้าง?
Josh G

5
ในคำตอบของ Josh G: หากคุณใช้ปุ่มโปร่งใสกับรูปภาพบนแผงปกติ (StackPanel เป็นต้น) จะมีเส้นขอบสีขาว เมื่อวางปุ่มเดียวกันบน ToolBar แล้วจะไม่มีเค้าร่างสีขาว
Chris Bennet

2
นอกจากนี้ยังมีประโยชน์หากคุณต้องการกำหนดธีมของแถบเครื่องมือในบริบทนี้เช่นลักษณะการทำงานของเมาส์โอเวอร์
Greg D

36
FYI: คุณสามารถใช้ StackPanel แบบธรรมดาและยังคงได้รับสไตล์ Toolbar <Button Style = "{StaticResource {x: Static ToolBar ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </Image> </Button>
thrag

1
นอกจากนี้ฉันพบว่าหากคุณไม่ต้องการใช้ตัวควบคุม <เมนู> ภายใน Toolbar ของคุณคุณสามารถตั้งค่าคุณสมบัติ ToolBar.OverflowMode = "Never" ได้โดยตรงภายในการควบคุม <Button> ภายในแถบเครื่องมือของคุณ สิ่งนี้สร้างเอฟเฟกต์ที่ฉันกำลังมองหา
ford

8

คุณสามารถใช้ Blend เพื่อแทนที่ ControlTemplateสำหรับ ToolBarPanel, Menu หรือ ToolBar

  1. คลิกขวาที่แถบเครื่องมือแล้วเลือกแก้ไขเทมเพลต
  2. จากแก้ไขเทมเพลตให้เลือกแก้ไขสำเนา
  3. ขอแนะนำให้เพิ่มสำเนาลงในพจนานุกรมทรัพยากร
  4. คลิกตกลง

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


ขอบคุณสำหรับข้อมูล. น่าเสียดายที่ blend2 และ vs2008 ดูเหมือนจะทำงานร่วมกันได้ไม่ดีสำหรับเรามีปัญหามากเกินไปเมื่อหนึ่งทำงานกับโค้ดที่สร้างขึ้นในอีกอันหนึ่งดังนั้นเราจึงไม่ปล่อยให้การผสมผสานเข้ามาใกล้กับรหัสเทียบของเรา)
ทอม

1
ใช่เราใช้ Blend ค่อนข้างเคร่งศาสนาจนกระทั่ง VS2k8SP1 เข้ามา จริงๆแล้วฉันอยากให้ตัวแก้ไข WPF ใน VS2k8 WAS Blend ดีกว่ามากที่จะสามารถคลิกขวาที่บางสิ่งและพูดว่า Group Into 'StackPanel' หรือ 'Border' MS ที่แย่เกินไปต้องการให้พวกเขาเป็นประสบการณ์ที่แตกต่างกัน
user7116

ฉันคิดว่า XAML Power Toys ใหม่เพิ่มคุณสมบัติที่ช่วยให้คุณจัดกลุ่มการควบคุมได้ (อาจจะเป็น MoXAML ของเล่นไฟฟ้า ... )
Number8

8

คุณสามารถ "ลบ" ส่วนที่ล้นออกได้โดยไม่ต้องจัดหาเทมเพลตการควบคุมใหม่โดยตั้งค่าToolBarให้มีขอบด้านขวาเป็นลบ (และเว้นระยะขอบด้านซ้ายที่เป็นค่าลบเพื่อไม่ให้ดูแปลกกับขอบซ้ายที่โค้งมน แต่มีขอบด้านขวาเป็นรูปสี่เหลี่ยมจัตุรัส) จากนั้นเพิ่มClipToBounds="True"เข้าไปToolBarPanelซึ่งจะตัดขอบของแถบเครื่องมือซึ่งตอนนี้ติดอยู่นอกพื้นที่ของแผง

<ToolBarPanel Grid.Row="0" ClipToBounds="True">
    <ToolBar ToolBarTray.IsLocked="True" Margin="-5,0,-13,0" Padding="5,0,0,0">
    . . .

6

แทนที่จะซ่อนปุ่มล้นอย่างสมบูรณ์ฉันคิดว่าควรแสดงเมื่อจำเป็นเท่านั้น สิ่งนี้สามารถทำได้โดยผูกVisibilityคุณสมบัติเข้ากับIsEnabledคุณสมบัติ:

private static void FixupToolBarOverflowArrow(ToolBar toolBar)
{
    Action fixup = () =>
    {
        var overflowButton = toolBar.Template.FindName("OverflowButton", toolBar) as ButtonBase;
        if (overflowButton != null)
        {
            overflowButton.SetBinding(
                VisibilityProperty,
                new Binding("IsEnabled")
                {
                    RelativeSource = RelativeSource.Self,
                    Converter = new BooleanToVisibilityConverter()
                });
        }
    };

    if (toolBar.IsLoaded)
    {
        fixup();
    }
    else
    {
        RoutedEventHandler handler = null;
        handler = (sender, e) =>
        {
            fixup();
            toolBar.Loaded -= handler;
        };

        toolBar.Loaded += handler;
    }
}

(สิ่งเดียวกันสามารถทำได้ใน XAML โดยการกำหนดเทมเพลตใหม่)


3

ฉันเพิ่งเริ่มใช้ WPF และไม่สามารถใช้วิธีการใด ๆ ข้างต้นเพื่อซ่อนลูกศรล้นของฉัน (Visual Studio 2010) สิ่งเดียวที่ดูเหมือนจะส่งผลต่อลูกศรคือตัวอย่าง Toolbar_Load ด้านบน แต่สิ่งที่ทำคือเปลี่ยนลูกศรให้เป็น พื้นที่ว่างเปล่าที่ดูแย่เหมือนลูกศร วิธีที่ง่ายที่สุดที่ฉันคิดได้คือการกำหนดระยะขอบของแถบเครื่องมือ

<ToolBar Height="26" 
         Name="toolBar" 
         DockPanel.Dock="Top" 
         ToolBarTray.IsLocked="True" 
         ToolBar.OverflowMode="Never"        <!-- no effect -->
         Margin="0,0,-13,0">                 <!-- worked -->
         <Menu ToolBar.OverflowMode="Never"> <!-- no affect -->
             <MenuItem Header="_File"></MenuItem>
         </Menu>
</ToolBar>

0

วิธีการข้างต้นใช้เพื่อซ่อนการล้น ฉันใช้สิ่งต่อไปนี้เพื่อซ่อนกริปเปอร์:

         <Label Height="44" Width="30" Background="{StaticResource CtrlBackground}" Margin="-20,0,0,0"></Label>

สำหรับเค้าโครงแนวนอนและ

         <Label Height="44" Width="230" Background="{StaticResource CtrlBackground}" Margin="0,-20,0,0" HorizontalAlignment="Left"></Label>

สำหรับเค้าโครงแนวตั้ง วางด้านบนหลัง Toolbar (หรือ ToolbarTray หากใช้สิ่งนั้น)

ใช้ความกว้างและความสูงที่จำเป็นสำหรับปุ่มของคุณ

Kaxaml ยอดเยี่ยมสำหรับการเล่นกับสิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.