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

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

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

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

도구 모음 이미지



답변

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


답변

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

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

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


답변

ToolBar음수 오른쪽 여백 으로 설정하여 새 컨트롤 템플릿을 제공하지 않고 오버플로를 “제거”할 수 있습니다 (그리고 왼쪽 가장자리가 둥글지만 오른쪽 가장자리가 정사각형으로 이상하게 보이지 않도록 음의 왼쪽 여백을 넣습니다). 그런 다음 패널 영역 밖에 붙어있는 툴바의 가장자리를 잘라낼에 추가 ClipToBounds="True"합니다 ToolBarPanel.

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


답변

오버플로 버튼을 완전히 숨기는 것보다 필요할 때만 표시하는 것이 좋습니다. 이는 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에서 동일한 작업을 수행 할 수 있습니다.)


답변

방금 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>


답변

위의 메서드는 오버플로를 숨 깁니다. 그리퍼를 숨기기 위해 다음을 사용했습니다.

         <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은이 물건을 가지고 놀기에 탁월합니다.


답변