WPF - własny pasek tytułowy

0

Witam,

Chciałbym uzyskać pasek jak na zdjęciu:

screenshot-20200719184837.png

jednak mam problem jak zrobić aby na 2 pierwszych kolumnach działało zdarzenie: PreviewMouseLeftButtonDown
a na 3 ostatnich: Click

<Grid>
        <Grid Background="#1C2F3E" Height="50" VerticalAlignment="Top"> 
        <!-- Jeżeli tu dam  PreviewMouseLeftButtonDown to na przyciskach nie działa Click-->

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50"/>
                <ColumnDefinition Width="*"/> <!-- Jeżeli tu dam  PreviewMouseLeftButtonDown to nie działa-->
                <ColumnDefinition Width="40"/>
                <ColumnDefinition Width="40"/>
                <ColumnDefinition Width="40"/>
            </Grid.ColumnDefinitions>

            <TextBlock Text="Tytuł" HorizontalAlignment="Center"  FontSize="34" Grid.Column="1" Foreground="#E0FFFF"/> 
            <!-- Jeżeli tu dam PreviewMouseLeftButtonDown to działa, 
            ale tylko na długości wyświetlanego napisu a nie na całej kolumnie-->
            
            <Button Content="1" Grid.Column="2" Click="BTN1_Click"/>
            <Button Content="2" Grid.Column="3" Click="BTN2_Click"/>
            <Button Content="3" Grid.Column="4" Click="BTN3_Click"/>
        </Grid>
    </Grid>
2

Jako ,że nie podałeś szczegółów to wrzucę ci ogólny link do podobnego pytania na SO

https://stackoverflow.com/questions/9978444/how-can-i-style-the-border-and-title-bar-of-a-window-in-wpf

0

Chodzi o to aby na całości kolumny 1 i 2 działało zdarzenie PreviewMouseLeftButtonDown wywołujace metodę DragMove() w celu przeciągania okna. Natomiast na 3, 4 i 5 kolumnie działo zdarzenie Click wywołujące przypisane metody. Po przypisaniu do zewnętrznego Grida działa przesuwanie nawet na przyciskach, a nie działa zdarzenie Click.

0

Zastosowanie zdarzenia MouseLeftButtonDown zamiast PreviewMouseLeftButtonDown w nadrzędnym Gridzie rozwiązuje problem. Na całym pasku działa metoda DragMove() , a na przyciskach zdarzenie Click.

0

Możesz to zrobić tak:

        <Grid x:Name="gdTitleBar" Grid.Row="0" MouseDown="gdTitleBar_MouseDown">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="530*"/>
                <ColumnDefinition Width="550*"/>
                <ColumnDefinition Width="160*"/>
            </Grid.ColumnDefinitions>
            
            
            <StackPanel Grid.Column="0" HorizontalAlignment="Left" >
                <TextBlock Text="Ikona"/> 
            </StackPanel>

            <StackPanel Orientation="Horizontal" Grid.Column="1">
                <TextBlock  Text="Tytuł"  HorizontalAlignment="Left"/>
            </StackPanel>
            
            <StackPanel HorizontalAlignment = "Left" Grid.Column="2" Orientation="Horizontal">
                <Button x:Name="btnMinimize" Content="---" Width="50" Margin="10,0,0,0" FontSize="20"/>
                <Button x:Name="btnMaximize" Content="[  ]" Width="50" Margin="10,0,0,0" FontSize="20"/>
                <Button x:Name="btnClose" Content="X" Width="50" Margin="10,0,0,0" FontSize="20"/>
            </StackPanel>
            
        </Grid>

A w CodeBehind obsługa przeciągania okienka i przycisków:

 private void btnClose_Click(object sender, RoutedEventArgs e)
        {
            Application.Current.MainWindow.Close();
        }

        private void btnMaximize_Click(object sender, RoutedEventArgs e)
        {
            if (this.WindowState == WindowState.Maximized)
            {
                this.WindowState = WindowState.Normal;
            }
            else
            {
                this.WindowState = WindowState.Maximized;
            }
        }

        private void btnMinimize_Click(object sender, RoutedEventArgs e)
        {
            this.WindowState = WindowState.Minimized;
        }

        private void gdTitleBar_MouseDown(object sender, MouseButtonEventArgs e)
        {
            if(e.ChangedButton == MouseButton.Left)
            {
                this.DragMove();
            }
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1