Harry Adams
Harry Adams

Reputation: 487

DragMove on Rectangle only works near edge?

I've created a custom error box with a rectangle for a header bar (the window is borderless). I'm trying to get the header rectangle to work like any window header bar and allow dragging to move. I have the code in place, however it only works by the edge of the rectangle (approx half a cm) and not anywhere in the rectangle.

I've set the height, width, and fill of the rectangle but not sure if there's a property I'm missing somewhere which allows click drag to work anywhere?

Rectangle definition:

<Window x:Class="CustomErrorBox"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:View"
        mc:Ignorable="d"
        Title="WpfMessageBox"  MinHeight="240" 
        MinWidth="500" MaxHeight="540" MaxWidth="720" 
        Background="Transparent" 
        SizeToContent="WidthAndHeight" 
        WindowStartupLocation="CenterScreen"  
        ShowInTaskbar="False" ResizeMode="NoResize" 
        WindowStyle="None" Topmost="True"
        Name="WindowError" SizeChanged="WindowError_SizeChanged">
    <Border BorderBrush="LightSlateGray" BorderThickness="0" CornerRadius="0">
        <Grid >
            <Grid.Resources>
            <Style TargetType="Button" x:Key="MessageBoxButtonStyle">
                <Setter Property="Background" Value="Transparent" />
                <Setter Property="TextBlock.TextAlignment" Value="Center" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Border  Name="Border" CornerRadius="0" BorderBrush="#000" BorderThickness="1,1,1,1" Background="{TemplateBinding Background}">
                                <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" 
                                                    HorizontalAlignment="{TemplateBinding HorizontalAlignment}" Margin="{TemplateBinding Padding}" 
                                                    VerticalAlignment="{TemplateBinding VerticalAlignment}" />
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
            </Grid.Resources>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Rectangle Grid.Row="0"  Grid.Column="0"  Grid.ColumnSpan="2" MouseDown="Rectangle_MouseDown" Width="Auto" Height="Auto">
                <Rectangle.Fill>
                    <!-- TODO - Find some nice colours for header bar -->
                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" Opacity="0.5">
                        <GradientStop Color="#26508A" Offset="0.0"/>
                        <GradientStop Color="#2A739E" Offset="1.0"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
            </Rectangle>
            <Rectangle Grid.Row="1" Grid.Column="0" Grid.RowSpan="3" Grid.ColumnSpan="2" Width="Auto" Height="Auto">
                <Rectangle.Fill>
                    <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" Opacity="0.8">
                        <GradientStop Color="#FF7FCFFF" Offset="1"/>
                        <GradientStop Color="#FFCFFFCF"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
            </Rectangle>
            <Grid Grid.Row="0" Grid.ColumnSpan="2" MinHeight="40" >
                <TextBlock Margin="5,1,0,1" Name="MessageTitle" FontWeight="Bold" TextTrimming="CharacterEllipsis" LineHeight="22" FontSize="16" VerticalAlignment="Center" Foreground="White"/>
            </Grid>
            <Image Name="img" Margin="5" Grid.Row="1" Grid.Column="0" Width="35" Height="35"  Stretch="Fill" />
            <ScrollViewer Grid.Row="1" Grid.Column="1" VerticalScrollBarVisibility="Auto">
                <TextBlock Margin="10,5,10,5"  VerticalAlignment="Center" TextWrapping="Wrap" Name="txtMsg" FontSize="14" LineHeight="20" ScrollViewer.VerticalScrollBarVisibility="Auto" />
            </ScrollViewer>
                <Grid Grid.Row="2" Grid.ColumnSpan="2" Grid.Column="0" >
                <StackPanel Orientation="Horizontal"  HorizontalAlignment="Right" >
                    <Button Name="btnOk" Content="OK" Margin="3,5" MinWidth="70" Height="35" Click="Button_Click" Foreground="Black" FontSize="14" Style="{StaticResource MessageBoxButtonStyle}"     
                            Background="#b6dbd6" VerticalAlignment="Center" HorizontalAlignment="Stretch" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" />
                    <Button Name="btnYes" Content="Yes" Margin="3,5" MinWidth="70" Height="35" Click="Button_Click" Foreground="Black" FontSize="14" Style="{StaticResource MessageBoxButtonStyle}"    
                            Background="#b6dbd6" VerticalAlignment="Center" HorizontalAlignment="Stretch" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
                    <Button Name="btnNo" Content="No" Margin="3,5" MinWidth="70" Height="35" Click="Button_Click" Foreground="Black" FontSize="14" Style="{StaticResource MessageBoxButtonStyle}"   
                            Background="#dbb6b6" VerticalAlignment="Center" HorizontalAlignment="Stretch" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" />
                    <Button Name="btnCancel" Margin="3,5" Content="Cancel" MinWidth="70" Height="35" Click="Button_Click" Style="{StaticResource MessageBoxButtonStyle}" Foreground="Black" 
                            Background="#dbb6b6" FontSize="14" VerticalAlignment="Center" HorizontalAlignment="Stretch" VerticalContentAlignment="Center" HorizontalContentAlignment="Center"/>
                </StackPanel>
            </Grid>
            <Expander Header="Further Information" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Margin="5,5,0,0">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="30"/>
                    </Grid.RowDefinitions>
                    <ScrollViewer Grid.Row="0">
                        <TextBlock Margin="10,5,10,5" Name="ExpanderMessage" TextWrapping="Wrap" ScrollViewer.VerticalScrollBarVisibility="Auto"/>
                    </ScrollViewer>
                    <Button Grid.Row="1" Name="ClipboardButton" Click="Button_Click_1" Content="Copy to Clipboard" HorizontalAlignment="Right" Margin="5"/>
                </Grid>
            </Expander>
        </Grid>
    </Border>
</Window>

MouseClick function:

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

Upvotes: 0

Views: 45

Answers (1)

mm8
mm8

Reputation: 169150

The issue is that your "MessageTitle" TextBlock is in top of the Rectangle.

If you intend to set the Text property of this TextBlock to display a title, you could use a WindowChrome instead of handling the MouseDown event for the Rectangle:

<Window ...>
    <WindowChrome.WindowChrome>
        <WindowChrome CaptionHeight="40" GlassFrameThickness="0" CornerRadius="0" />
    </WindowChrome.WindowChrome>
    <Border BorderBrush="LightSlateGray" BorderThickness="0" CornerRadius="0">
        <Grid >
            ...
            <Rectangle Grid.ColumnSpan="2" Height="40">
                <Rectangle.Fill>
                    <!-- TODO - Find some nice colours for header bar -->
                </Rectangle.Fill>
            </Rectangle>

Upvotes: 1

Related Questions