WPF Создание пользовательских событий - PullRequest
2 голосов
/ 21 июля 2010

Я работаю над частью меню, чтобы позволить пользователю реорганизовать его. Это меню имеет сетку (4x3) с 12 элементами, каждый из которых имеет тип NavButton, класс, который я создал, расширяющий Button. В NavButton у меня есть функция перетаскивания, которая позволяет перемещать кнопки по всей сетке, и в настоящее время я работаю над тем, чтобы определить, где каждая кнопка должна находиться в событии MouseEnter.

Чтобы определить, где должны быть переставлены навигационные кнопки, я поместил тонкие прямоугольники, которые будут светлее на MouseEnter, или я подумал, что именно так они и должны работать. Моя проблема в том, что когда NavButton перетаскивается по прямоугольникам, событие MouseEnter не будет запускаться, так как мышь находится над NavButton, которая находится над прямоугольником. Извините, если это звучит странно, но я опубликую код ниже.

Все это говорит: мне интересно, можно ли вообще создать событие, чтобы определить, когда NavButton «входит» в прямоугольник, подобно тому, как работает событие MouseEnter?

C #:

    private void rectangle_MouseEnter(object sender, MouseEventArgs e)
    {
        foreach (UIElement uie in this.grids[tabNavigation.SelectedIndex].Children)
        {
            if (uie.GetType() == typeof(NavButton_UC))
            {
                if ((uie as NavButton_UC).IsDragging)
                {
                    (sender as Rectangle).Fill = Brushes.Gray;
                }
            }
        }
    }

    private void rectangle_MouseLeave(object sender, MouseEventArgs e)
    {
        (sender as Rectangle).Fill = Brushes.Black;
    }

XAML:

             //The Style is in my ResourceDictionary
             <Style TargetType="Rectangle">
                <Setter Property="Fill" Value="Black" />
                <Setter Property="Height" Value="151" />
                <Setter Property="Width" Value="10" />
                <Setter Property="HorizontalAlignment" Value="Left" />
                <Setter Property="Opacity" Value=".6" />
                <EventSetter Event="MouseEnter" Handler="rectangle_MouseEnter" />
                <EventSetter Event="MouseLeave" Handler="rectangle_MouseLeave" />
            </Style>
            ...
            <Grid Name="grid" Background="Black">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                    <RowDefinition Height="22"></RowDefinition>
                </Grid.RowDefinitions>
                <Rectangle Grid.Row="0" Grid.Column="0" Name="rect00" />
                <Rectangle Grid.Row="0" Grid.Column="1" Name="rect01" />
                <Rectangle Grid.Row="0" Grid.Column="2" Name="rect02" />
                <Rectangle Grid.Row="1" Grid.Column="0" Name="rect10" />
                <Rectangle Grid.Row="1" Grid.Column="1" Name="rect11" />
                <Rectangle Grid.Row="1" Grid.Column="2" Name="rect12" />
                <Rectangle Grid.Row="2" Grid.Column="0" Name="rect20" />
                <Rectangle Grid.Row="2" Grid.Column="1" Name="rect21" />
                <Rectangle Grid.Row="2" Grid.Column="2" Name="rect22" />
                <Rectangle Grid.Row="3" Grid.Column="0" Name="rect30" />
                <Rectangle Grid.Row="3" Grid.Column="1" Name="rect31" />
                <Rectangle Grid.Row="3" Grid.Column="2" Name="rect32" />
                <TextBlock Grid.Row="5" Grid.Column="3" Name="TB" />
            </Grid>

Я довольно новичок в WPF, поэтому любые знания будут оценены. Спасибо.

1 Ответ

1 голос
/ 21 июля 2010

Это определенно возможно, но это может быть нелегко.

Джош Смит опубликовал эту статью , в которой содержится код для реализации этого с ListView. Он создал вложенное свойство «IsUnderDragCursor» и показывает триггер, в котором элемент под «курсором перетаскивания» становится синим.

Очевидно, вам нужно взять источник и адаптировать его для работы с вашим меню и навигационными кнопками, но принципы все есть.

...