WPF ToolBar: tutuş ve taşma nasıl kaldırılır


98

İç içe geçmiş bir WPF ToolBarPanel-ToolBar-Menu'de, sol taraftaki tutma tutamacından ve sağdaki taşma alanından kurtulmak istiyoruz. ikisi de gri, ancak hiç görüntülenmemelerini istiyoruz.

bunu nasıl başaracağınıza dair herhangi bir fikriniz var mı?

Koşullarımın tamamen doğru olmaması durumunda, aşağıdaki bağlantıya ait Şekil 3'teki resme bakarsanız, üç araç çubuğunun en alt kısmında, açılır menünün solunda ve en sağının sağında tutma yeri vardır. düğmesi taşma var.

Araç çubuklarının resmi


Muhtemelen kontrol şablonunun üzerine yazarak yapabilirsiniz ... ama ben bunu tavsiye etmem.
apandit

Sağ tarafı görünümün dışına itmek için Araç Çubuğuna Margin = "0,0, -14,0" koyabilirsiniz. Bulduğum en kolay çözüm bu, ancak yalnızca bir ToolBar ile bir ToolBarPanel veya bir ToolBarTray içinde test etmedim.
Wayne Bloss 14'11

Yanıtlar:


153

ToolBarTray.IsLocked="True"Tutamaç, araç çubuğundaki ekli özellik ayarlanarak çıkarılabilir .

Kaldırmak için Taşma ToggleButton'a , size karışımı varsa veya Blend 3 Önizleme aşırı zor değildir indirebilirsiniz eğer anlaşılacağı sixlettervariables gibi özel bir ControlTemplate, bunu kaldırmak zorunda kalacaktır.

Düğmeyi Araç Çubuğunun yüklenen olayında da gizleyebilirsiniz, ancak hangi rotayı kullanırsanız kullanın, ekli özelliği ToolBar.OverflowMode="Never"Araç Çubuğu menüsünde de ayarlamanız gerekir , böylece öğeler yanlışlıkla erişilemez bir alana taşmaz.

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

Ve Taşma ToggleButton öğesini daraltılmış olarak ayarlayı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
Şu soruyu akla getiriyor: Neden bir Araç Çubuğu kullanılıyor? Neden Düğmelerle birlikte basit bir StackPanel kullanmıyorsunuz? Araç Çubuğu ne fayda sağlar?
Josh G

5
Josh G'ye yanıt olarak: Normal bir panelde (StackPanel vb.) Bir görüntü ile şeffaf bir düğme kullanırsanız, beyaz bir dış çizgiye sahip olacaktır. Aynı düğme bir Araç Çubuğu'na yerleştirildiğinde, beyaz anahat mevcut değildir.
Chris Bennet

2
Bu bağlamda, örneğin fareyle üzerine gelme davranışı gibi bir araç çubuğunun temasını istiyorsanız da bu yararlıdır.
Greg D

36
Bilginize: Basit bir StackPanel kullanabilir ve yine de Araç Çubuğu stilini alabilirsiniz. <Düğme Stili = "{StaticResource {x: Statik ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource Zoomin}"> </ Görüntü> </ Düğme>
thrag

1
Ayrıca, Araç Çubuğunuzdaki <Menü> denetimini kullanmak istemiyorsanız, Araç Çubuğu.OverflowMode = "Asla" özelliğinin doğrudan araç çubuğunuzdaki <Button> denetiminizin içinde ayarlanabileceğini buldum. Bu aradığım etkiyi yarattı
ford

8

Sen edebilirsiniz yerine sadece ControlTemplate geçersiz kılmak için Blend kullanmak ToolBarPanel, Menü veya ToolBar için.

  1. Araç Çubuğu'na sağ tıklayın ve Şablonu Düzenle'yi seçin
  2. Şablonu Düzenle'den Bir Kopyasını Düzenle'yi seçin
  3. Kopyayı bir Kaynak Sözlüğüne eklemenizi öneririm
  4. Tamam'ı tıklayın

Şimdi ToolBarPanel için kontrol şablonunu düzenleyeceksiniz ve kavrama ve taşma sinyali için görünürlüğü Daraltılmış olarak ayarlayabilirsiniz. Diğer kontroller için durulayabilir ve tekrarlayabilirsiniz. Biraz zaman alıyor, ancak Blend ile çok zor değil.


bilgi için teşekkürler. maalesef blend2 ve vs2008 bizim için iyi çalışmıyor gibi görünüyor, biri diğerinde oluşturulan kodla çalıştığında çok fazla sorun var, bu yüzden şu anda harmanın vs kodumuzun yakınına gelmesine izin vermiyoruz;)
Tom

1
Evet, VS2k8SP1 gelene kadar Blend'i oldukça dini bir şekilde kullandık. Aslında VS2k8 WAS Blend içindeki WPF editörünün olmasını diliyorum. Bir şeye sağ tıklayıp Group Into 'StackPanel' veya 'Border' diyebilmek çok daha hoş. Çok kötü MS, onların farklı deneyimler olmasını ister.
user7116

Yeni XAML Power Toys'un kontrolleri gruplandırmanıza izin veren bir özellik eklediğini düşünüyorum. (Belki MoXAML Güç Oyuncakları ...)
Sayı8

8

Yeni bir kontrol şablonu sağlamadan taşmayı ToolBar, negatif sağ kenar boşluklarına sahip olacak şekilde ayarlayarak (ve yuvarlatılmış sol kenarlar yerine kare sağ kenarlarla tuhaf görünmemesi için negatif bir sol kenar boşluğu atarak) "kaldırabilirsiniz" . Ardından eklemek ClipToBounds="True"için ToolBarPanelşimdi panelin alanı dışında yapıştırıyoruz araç çubuğunun kenarları kesilmiş olan.

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

6

Taşma düğmesini tamamen gizlemek yerine, yalnızca gerektiğinde göstermenin daha iyi olacağını düşünüyorum. Bu, Visibilitymülkünü mülküne bağlayarak yapılabilir 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;
    }
}

(aynı şey şablonu yeniden tanımlayarak XAML'de yapılabilir)


3

WPF ile yeni başlıyorum ve taşma okumu gizlemek için yukarıdaki yöntemlerden hiçbirini alamadım (Visual Studio 2010). Oku etkilediği görülen tek şey, yukarıdaki Toolbar_Load örneğiydi ama yapılan tek şey oku ok kadar kötü görünen boş bir alan. Anlayabileceğim en kolay yol, araç çubuğunun kenar boşluklarını belirlemekti.

<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

Yukarıdaki yöntemler taşmayı gizlemek için çalışır; Kavrayıcıyı gizlemek için aşağıdakileri kullandım:

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

Yatay düzen için ve

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

Dikey düzen için. Yukarıdakileri Araç Çubuğunun (veya kullanıyorsanız Araç Çubuğu Kasasının) sonrasına yerleştirin

Düğmeleriniz için gereken Genişliği ve Yüksekliği kullanın.

Kaxaml bu şeylerle oynamak için mükemmel.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.