programing

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

nasanasas 2020. 9. 1. 07:35
반응형

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


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

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

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

도구 모음 이미지


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

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

ToolBar의로드 된 이벤트에서 버튼을 숨길 수도 있지만 어떤 경로를 선택하든 ToolBar.OverflowMode="Never"ToolBar의 메뉴 에서 연결된 속성 설정하여 항목이 실수로 도달 할 수없는 영역으로 오버플로되지 않도록해야합니다.

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

(the same thing can be done in XAML by redefining the template)


I am just starting out with WPF and could not get any of the above methods to hide my overflow arrow (Visual Studio 2010).The only thing that seemed to affect the arrow was the Toolbar_Load example above but all that did was turn the arrow into an empty space that looked as bad as the arrow. The easiest way I could figure was just to set the margins of the 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>

The methods above work to hide the overflow; I've used the following to hide the gripper:

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

for a Horizontal layout, and

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

for a Vertical layout. Place the above after the Toolbar(or ToolbarTray, if using that)

Use whatever Width and Height is needed for your buttons.

Kaxaml is excellent for playing with this stuff.

참고URL : https://stackoverflow.com/questions/1050953/wpf-toolbar-how-to-remove-grip-and-overflow

반응형