Hiện nút Button ngay tại vị trí Click WPF

Chào anh em!
Tình hình là mình đang muốn, khi click chuột phải vào ListViewItem, thì nó sẽ hiện một nút Button delete Item đó(hoặc một kiểu gì đó có thể xử lí tương tự) ngay tại vị trí click. Em Setter một cái PreviewMouseRightButtonDown vào ListViewItem rồi, nhưng ko biết làm gì tiếp theo.
Anh em thông não cho mình phát nha!
Thân~~~~

WPF thì dùng trigger hoặc VisualState trong Style, chứ không handle trong event trong code C#.

Doccument hơi khoai chút. Nếu bạn cần code mẫu thì mình gửi sau.
https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/button-styles-and-templates.

4 Likes

Chỉnh sửa template của listviewitem.

3 Likes

không handler như của mình được hả bạn?

Có vẻ bạn vẫn đang cố dùng cách của winform cho WPF.

Dưới đây là VD khi cho list view thay đổi hiệu ứng khi mouse enter or leave.

Your header here! (Click to expand)
  <Style x:Key="ListViewItemWithBorder" TargetType="{x:Type ListViewItem}">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="Margin" Value="0,0,0,1"/>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListViewItem">
                    <Grid>
                        <Grid.Effect>
                            <DropShadowEffect 
                                ShadowDepth="1" x:Name="shadow"
                                Color="#70CCCCCC"/>
                        </Grid.Effect>
                        <Border BorderThickness="1" CornerRadius="7" Margin="2" ClipToBounds="True"
                                    VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                            <Border.Background>
                                <SolidColorBrush Color="#ecf0f1" x:Name="backgroundOfItem"></SolidColorBrush>
                            </Border.Background>
                            <Border.BorderBrush>
                                <SolidColorBrush Color="#393e46" Opacity="0.2" x:Name="borderOfItem"></SolidColorBrush>
                            </Border.BorderBrush>
                        </Border>
                        <ContentPresenter  Margin="5,7" ClipToBounds="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <EventTrigger RoutedEvent="MouseEnter">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Duration="0:0:0.3" From="0.2" To="0.6" Storyboard.TargetName="borderOfItem"
                                            Storyboard.TargetProperty="Opacity"></DoubleAnimation>
                                    <DoubleAnimation Duration="0:0:0.3" From="1" To="3" 
                                                     Storyboard.TargetName="shadow"
                                            Storyboard.TargetProperty="ShadowDepth"/>
                                    <ColorAnimation Duration="0:0:0.3" To="#f4f4f4" 
                                                     Storyboard.TargetName="backgroundOfItem"
                                            Storyboard.TargetProperty="Color"/>

                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                        <EventTrigger RoutedEvent="MouseLeave">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Duration="0:0:0.3" From="0.6" To="0.2" Storyboard.TargetName="borderOfItem"
                                            Storyboard.TargetProperty="Opacity"></DoubleAnimation>
                                    <DoubleAnimation Duration="0:0:0.3" From="3" To="1" 
                                                     Storyboard.TargetName="shadow"
                                            Storyboard.TargetProperty="ShadowDepth"/>
                                    <ColorAnimation Duration="0:0:0.3" To="#ecf0f1" 
                                                     Storyboard.TargetName="backgroundOfItem"
                                            Storyboard.TargetProperty="Color"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

bạn có thể làm tương tự để ẩn hiện 1 nút nào đó.

Ngoài ra câu EventSetter của bạn chỉ là thêm event cho nó thôi.

4 Likes

Hehe, cảm ơn bạn, mình hiện luôn button ở cuối item như bạn luôn cho khỏe. À cho mình hỏi nhẹ cái nữa nha.
1 event Click Button chỉ chạy khi mình click vào button đó, vậy có cách nào khác để chạy event Click đó trong c# mà ko phải click ko bạn?

xử lý sự kiện click cũng chỉ là 1 method thôi, nên bạn gọi ở đâu cũng được.

private void Button1_Click(object sender, EventArgs e)
{
    //xử lý của btn 1
   Button btn = sender as Button.
   if(btn is null)
   {
        Console.WriteLine("Sự kiện không được gọi từ 1 button");
   }
}

private void MethodNaoDo()
{
    Button1_Click(this, null); // hoặc 
    Button1_Click(null, null); 
// trong trường hợp này nếu bạn xử lý sender và e trong sự kiện click cần chú ý null pointer exception.
}

Cách T2 đơn giản hơn là tách phần xử lý ra 1 method riêng và gọi ở bất kỳ đâu.

private void Button1_Click(object sender, EventArgs e)
{
   MethodNaoDo();
}
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?