WPF ToolBar: cách loại bỏ kẹp và tràn


98

Trong một WPF ToolBarPanel-ToolBar-Menu lồng nhau, chúng ta muốn loại bỏ phần tay cầm ở bên trái và vùng tràn ở bên phải. cả hai đều bị chuyển sang màu xám, nhưng chúng tôi muốn chúng hoàn toàn không được hiển thị.

bất kỳ ý tưởng về cách thực hiện điều đó?

đề phòng các điều khoản của tôi không hoàn toàn chính xác, nếu bạn nhìn vào hình ảnh trong Hình 3 của liên kết bên dưới, ở phần thấp nhất của ba thanh công cụ, có phần kẹp ở bên trái của menu thả xuống và ở bên phải của ngoài cùng bên phải có phần tràn.

Hình ảnh các thanh công cụ


Bạn có thể làm điều đó bằng cách ghi đè lên mẫu điều khiển ... nhưng tôi không khuyên bạn nên làm điều đó.
apandit

Bạn có thể đặt Margin = "0,0, -14,0" trên Thanh công cụ để đẩy phía bên phải ra khỏi tầm nhìn. Đây là giải pháp dễ dàng nhất mà tôi đã tìm thấy, nhưng tôi chỉ thử nghiệm với một ToolBar duy nhất không bên trong ToolBarPanel hoặc ToolBarTray.
Wayne Bloss,

Câu trả lời:


153

Có thể tháo báng bằng cách đặt thuộc tính đính kèm ToolBarTray.IsLocked="True"trên Thanh công cụ.

Để loại bỏ Overflow ToggleButton , bạn sẽ phải xóa nó trong ControlTemplate tùy chỉnh như sixlettervariables gợi ý, điều này nếu bạn có kết hợp hoặc có thể tải xuống Bản xem trước hỗn hợp 3 thì không quá khó.

Bạn cũng có thể ẩn nút trong sự kiện được tải của ToolBar, mặc dù bạn đi theo con đường nào, bạn cũng nên đặt thuộc tính đính kèm ToolBar.OverflowMode="Never"trên menu của ToolBar, để các mục không thể vô tình tràn vào vùng không thể truy cập.

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

Và đặt Overflow ToggleButton thành thu gọn:

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
Đặt ra câu hỏi: Tại sao lại sử dụng ToolBar? Tại sao không chỉ sử dụng một StackPanel đơn giản với Buttons? ToolBar cung cấp lợi ích gì?
Josh G

5
Trả lời Josh G: Nếu bạn sử dụng một nút trong suốt có hình ảnh trên bảng điều khiển bình thường (StackPanel, v.v.), nó sẽ có đường viền màu trắng. Tuy nhiên, khi cùng một nút được đặt trên Thanh công cụ, đường viền màu trắng không xuất hiện.
Chris Bennet

2
Điều này cũng hữu ích nếu bạn muốn chủ đề của thanh công cụ trong ngữ cảnh này, ví dụ: hành vi di chuột qua.
Greg D

36
FYI: Bạn có thể sử dụng một StackPanel đơn giản mà vẫn có được kiểu dáng của Thanh công cụ. <Button Style = "{StaticResource {x: Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </Image> </Button>
thrag

1
Ngoài ra, tôi nhận thấy rằng nếu bạn không muốn sử dụng điều khiển <Menu> trong Thanh công cụ của mình, thuộc tính ToolBar.OverflowMode = "Never" có thể được đặt trực tiếp bên trong điều khiển <Button> trong thanh công cụ của bạn. Điều này đã tạo ra hiệu ứng mà tôi đang tìm kiếm
ford

8

Bạn có thể sử dụng Blend để ghi đè ControlTemplate cho ToolBarPanel, Menu hoặc ToolBar.

  1. Nhấp chuột phải vào Thanh công cụ và chọn Chỉnh sửa Mẫu
  2. Từ Chỉnh sửa Mẫu, hãy chọn Chỉnh sửa Bản sao
  3. Tôi khuyên bạn nên thêm bản sao vào Từ điển tài nguyên
  4. Bấm Ok

Bây giờ, bạn sẽ chỉnh sửa mẫu điều khiển cho ToolBarPanel và có thể đặt khả năng hiển thị thành Thu gọn cho phần bám và tín hiệu tràn. Bạn có thể rửa sạch và lặp lại cho các điều khiển khác. Nó hơi tốn thời gian, nhưng không quá khó với Blend.


Cảm ơn bạn về thông tin. may blend2 và vs2008 không dường như làm việc tốt với nhau cho chúng ta, quá nhiều vấn đề khi một tác phẩm với mã được tạo trong khác, vì vậy chúng tôi hiện không cho phép pha trộn đến bất cứ nơi nào gần chúng tôi vs mã;)
Tom

1
Vâng, chúng tôi đã sử dụng Blend một cách khá tôn giáo cho đến khi VS2k8SP1 xuất hiện. Trên thực tế, tôi muốn trình soạn thảo WPF trong VS2k8 WAS Blend. Đẹp hơn nhiều khi có thể nhấp chuột phải vào thứ gì đó và nói Group Into 'StackPanel' hoặc 'Border'. Thật tệ là MS muốn chúng là những trải nghiệm khác biệt.
user7116

Tôi nghĩ Đồ chơi điện XAML mới bổ sung một tính năng cho phép bạn nhóm các điều khiển. (Có lẽ đó là MoXAML Power Toys ...)
Number8

8

Bạn có thể "loại bỏ" phần tràn mà không cần cung cấp mẫu điều khiển mới bằng cách thiết lập ToolBarđể có lề phải âm (và ném vào lề trái âm để nó trông không kỳ quặc với các cạnh trái tròn nhưng các cạnh phải vuông). Sau đó, thêm ClipToBounds="True"vào ToolBarPanelđó sẽ cắt bỏ các cạnh của thanh công cụ hiện đang nằm bên ngoài khu vực của bảng điều khiển.

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

5

Thay vì ẩn hoàn toàn nút tràn, tôi nghĩ chỉ nên hiển thị nó khi cần thiết. Điều này có thể được thực hiện bằng cách ràng buộc Visibilitytài sản của nó với IsEnabledtài sản của nó :

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;
    }
}

(điều tương tự có thể được thực hiện trong XAML bằng cách xác định lại mẫu)


3

Tôi chỉ mới bắt đầu với WPF và không thể lấy bất kỳ phương pháp nào ở trên để ẩn mũi tên tràn của tôi (Visual Studio 2010). Điều duy nhất có vẻ ảnh hưởng đến mũi tên là ví dụ Toolbar_Load ở trên nhưng tất cả những gì đã làm là biến mũi tên thành một khoảng trống trông xấu như mũi tên. Cách dễ nhất mà tôi có thể hình dung là chỉ đặt lề của thanh công cụ.

<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

Các phương thức trên hoạt động để ẩn phần tràn; Tôi đã sử dụng những điều sau để ẩn bộ kẹp:

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

cho một bố cục Ngang và

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

cho một bố cục dọc. Đặt ở trên sau Thanh công cụ (hoặc Thanh công cụ, nếu sử dụng)

Sử dụng bất kỳ Chiều rộng và Chiều cao nào cần thiết cho các nút của bạn.

Kaxaml rất xuất sắc khi chơi với thứ này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.