WPF ToolBar: cara menghilangkan grip dan overflow

98

Dalam WPF ToolBarPanel-ToolBar-Menu bersarang kita ingin menyingkirkan pegangan pegangan ke kiri dan area luapan ke kanan. keduanya berwarna abu-abu, tapi kami ingin mereka tidak ditampilkan sama sekali.

ada ide tentang bagaimana mencapai itu?

untuk berjaga-jaga jika istilah saya tidak sepenuhnya benar, jika Anda melihat gambar pada Gambar 3 dari tautan di bawah ini, di paling bawah dari tiga bilah alat ada pegangan di sebelah kiri dropdown dan di sebelah kanan paling kanan. tombol ada luapan.

Gambar bilah alat

Tom
sumber
Anda mungkin bisa melakukannya dengan menimpa template kontrol ... tapi saya tidak akan merekomendasikannya.
apandit
Anda dapat meletakkan Margin = "0,0, -14,0" pada ToolBar untuk mendorong sisi kanan keluar dari tampilan. Ini adalah solusi termudah yang saya temukan, tetapi saya hanya menguji dengan satu ToolBar bukan di dalam ToolBarPanel atau ToolBarTray.
Wayne Bloss

Jawaban:

153

Pegangan dapat dilepas dengan mengatur properti terlampir ToolBarTray.IsLocked="True"pada ToolBar.

Untuk menghapus Overflow ToggleButton , Anda harus menghapusnya di ControlTemplate kustom seperti yang disarankan oleh sixlettervariables, yang jika Anda memiliki campuran atau dapat mendownload Blend 3 Preview tidaklah terlalu sulit.

Anda juga dapat menyembunyikan tombol pada acara ToolBar yang dimuat, meskipun rute mana pun yang Anda ambil, Anda juga harus menyetel properti terlampir ToolBar.OverflowMode="Never"pada menu ToolBar, sehingga item tidak dapat meluap secara tidak sengaja ke area yang tidak dapat dijangkau.

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

Dan atur Overflow ToggleButton menjadi diciutkan:

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();
    }
}
rmoore
sumber
15
Memunculkan pertanyaan: Mengapa menggunakan ToolBar sama sekali? Mengapa tidak menggunakan StackPanel sederhana dengan Tombol saja? Manfaat apa yang disediakan ToolBar?
Josh G
5
Sebagai jawaban untuk Josh G: Jika Anda menggunakan tombol transparan dengan gambar pada panel normal (StackPanel dll), akan ada garis luar berwarna putih. Ketika tombol yang sama ditempatkan pada ToolBar, garis luar putih tidak ada.
Chris Bennet
2
Ini juga berguna jika Anda menginginkan tema toolbar dalam konteks ini, misalnya perilaku gerakan mouse.
Greg D
36
FYI: Anda dapat menggunakan StackPanel sederhana dan tetap mendapatkan gaya Toolbar. <Button Style = "{StaticResource {x: Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </Image> </Button>
tunda
1
Selain itu, saya menemukan bahwa jika Anda tidak ingin menggunakan kontrol <Menu> di dalam Toolbar, properti ToolBar.OverflowMode = "Never" dapat disetel langsung di dalam kontrol <Button> di dalam toolbar. Hal ini menciptakan efek yang saya cari
ford
8

Anda dapat menggunakan Blend untuk lebih hanya menimpa ControlTemplate untuk ToolBarPanel, Menu, atau ToolBar.

  1. Klik kanan pada ToolBar dan pilih Edit Template
  2. Dari Edit Template, pilih Edit Salinan
  3. Saya merekomendasikan menambahkan salinan ke Resource Dictionary
  4. Klik Ok

Sekarang Anda akan mengedit template kontrol untuk ToolBarPanel, dan dapat mengatur visibilitas ke Diciutkan untuk sinyal pegangan dan luapan. Anda dapat membilas dan mengulang untuk kontrol lainnya. Ini sedikit memakan waktu, tetapi tidak terlalu sulit dengan Blend.

pengguna7116
sumber
terimakasih atas infonya. sayangnya blend2 dan vs2008 tampaknya tidak bekerja sama dengan baik bagi kami, terlalu banyak masalah ketika salah satu bekerja dengan kode yang dihasilkan di yang lain, jadi saat ini kami tidak membiarkan campuran mendekati kode vs kami;)
Tom
1
Ya kami menggunakan Blend dengan cukup religius sampai VS2k8SP1 muncul. Sebenarnya saya agak berharap editor WPF di VS2k8 WAS Blend. Jauh lebih menyenangkan untuk dapat mengklik kanan pada sesuatu dan mengatakan Group Into 'StackPanel' atau 'Border'. Sayang sekali MS ingin mereka menjadi pengalaman yang berbeda.
pengguna7116
Saya pikir XAML Power Toys baru menambahkan fitur yang memungkinkan Anda untuk mengelompokkan kontrol. (Mungkin MoXAML Power Toys ...)
Nomor 8
8

Anda dapat "menghapus" luapan tanpa menyediakan template kontrol baru dengan mengatur ToolBaragar memiliki margin kanan negatif (dan memasukkan margin kiri negatif sehingga tidak terlihat aneh dengan tepi kiri membulat tetapi tepi kanan persegi). Kemudian, tambahkan ClipToBounds="True"ke ToolBarPanelyang akan memotong tepi toolbar yang sekarang mencuat luar daerah panel.

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

Daripada menyembunyikan tombol overflow sepenuhnya, saya pikir lebih baik menampilkannya hanya jika diperlukan. Ini dapat dilakukan dengan mengikat Visibilitypropertinya ke IsEnabledpropertinya:

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

(hal yang sama dapat dilakukan di XAML dengan mendefinisikan ulang template)

Thomas Levesque
sumber
3

Saya baru saja memulai dengan WPF dan tidak bisa mendapatkan metode di atas untuk menyembunyikan panah overflow saya (Visual Studio 2010). Satu-satunya hal yang tampaknya memengaruhi panah adalah contoh Toolbar_Load di atas tetapi yang dilakukan hanyalah mengubah panah menjadi ruang kosong yang terlihat seburuk panah. Cara termudah yang bisa saya pikirkan hanyalah mengatur margin toolbar.

<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>
Belmiris
sumber
0

Metode di atas berfungsi untuk menyembunyikan overflow; Saya telah menggunakan yang berikut ini untuk menyembunyikan gripper:

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

untuk tata letak Horizontal, dan

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

untuk tata letak Vertikal. Tempatkan di atas setelah Toolbar (atau ToolbarTray, jika menggunakan itu)

Gunakan Lebar dan Tinggi apa pun yang diperlukan untuk tombol Anda.

Kaxaml sangat bagus untuk bermain dengan barang ini.

frediano
sumber