WPF ToolBar : 그립 및 오버플로를 제거하는 방법


98

중첩 된 WPF ToolBarPanel-ToolBar-Menu에서 왼쪽의 그립 핸들과 오른쪽의 오버플로 영역을 제거하려고합니다. 둘 다 회색으로 표시되지만 전혀 표시하지 않기를 바랍니다.

그것을 달성하는 방법에 대한 아이디어가 있습니까?

내 용어가 완전히 정확하지 않은 경우를 대비하여 아래 링크의 그림 3에있는 이미지를 보면 세 개의 도구 모음 중 가장 낮은 곳에 드롭 다운 왼쪽과 맨 오른쪽 오른쪽에 그립이 있습니다. 버튼에 오버플로가 있습니다.

도구 모음 이미지


컨트롤 템플릿을 덮어 써서 할 수는 있지만 권장하지 않습니다.
apandit 2009-06-26

ToolBar에 Margin = "0,0, -14,0"을 입력하여 오른쪽을보기 밖으로 밀어 낼 수 있습니다. 이것은 내가 찾은 가장 쉬운 솔루션이지만 ToolBarPanel 또는 ToolBarTray 내부가 아닌 단일 ToolBar로만 테스트했습니다.
Wayne Bloss 2011 년

답변:


153

ToolBarTray.IsLocked="True"도구 모음 에서 연결된 속성 을 설정하여 그립을 제거 할 수 있습니다 .

Overflow ToggleButton 을 제거하려면 sixlettervariables가 제안하는대로 사용자 지정 ControlTemplate에서 제거해야합니다. 블렌드가 있거나 Blend 3 미리보기를 다운로드 할 수 있다면 그렇게 어렵지 않습니다.

도구 모음의로드 된 이벤트에서 버튼을 숨길 수도 있지만 어떤 경로를 선택하든 도구 모음 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
참고 : 간단한 StackPanel을 사용해도 여전히 툴바 스타일을 얻을 수 있습니다. <Button Style = "{StaticResource {x : Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </ Image> </ Button>
thrag

1
또한 도구 모음 내에서 <Menu> 컨트롤을 사용하지 않으려면 도구 모음 내에서 <Button> 컨트롤 내에서 ToolBar.OverflowMode = "Never"속성을 직접 설정할 수 있습니다. 이것은 내가 찾고 있던 효과를 만들었습니다
ford

8

Blend를 사용 하여 ToolBarPanel, Menu 또는 ToolBar 의 ControlTemplate간단히 재정의 할 수 있습니다 .

  1. 도구 모음을 마우스 오른쪽 버튼으로 클릭하고 템플릿 편집을 선택합니다.
  2. 템플릿 편집에서 복사본 편집을 선택합니다.
  3. 리소스 사전에 사본을 추가하는 것이 좋습니다.
  4. 확인을 클릭하십시오.

이제 ToolBarPanel의 컨트롤 템플릿을 편집하고 그립 및 오버플로 신호에 대해 가시성을 Collapsed로 설정할 수 있습니다. 다른 컨트롤에 대해 헹구고 반복 할 수 있습니다. 시간이 조금 걸리지 만 Blend에서는 그리 어렵지 않습니다.


정보 주셔서 감사합니다. 안타깝게도 blend2와 vs2008은 잘 작동하지 않는 것 같습니다. 하나가 다른 코드에서 생성 된 코드로 작업 할 때 너무 많은 문제가 발생하므로 현재는 블렌드를 vs 코드 근처에 두지 않습니다.)
Tom

1
예, VS2k8SP1이 나올 때까지 Blend를 상당히 종교적으로 사용했습니다. 실제로 VS2k8 WAS Blend의 WPF 편집기를 원합니다. 무언가를 마우스 오른쪽 버튼으로 클릭하고 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">
    . . .

5

오버플로 버튼을 완전히 숨기는 것보다 필요할 때만 표시하는 것이 좋습니다. 이는 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 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.