1

アプリケーションに、いくつかのアクション用にDataGridカスタム定義を追加したコントロールがあります。Popup基本的なことは次のとおりです。 にdouble表示された数値のマトリックスがありますDataGrid。選択したセルを右クリックするとポップアップが表示され、ユーザーは値を入力して Enter キーを押すと、選択した値をシフトできます (選択したすべての値は、入力した値で増分されます)。

現在の動作は次のとおりです。

シフトポップアップ

ポップアップの XAML コード:

<Style x:Key="ShiftPopupStyle" TargetType="{x:Type Popup}">
    <Setter Property="IsOpen" Value="False" />
    <Setter Property="StaysOpen" Value="False" />
    <Setter Property="AllowsTransparency" Value="True" />
    <Setter Property="PopupAnimation" Value="Fade" />
    <Setter Property="Placement" Value="Mouse" />
    <Setter Property="Child">
        <Setter.Value>
            <Border BorderBrush="Navy" Background="AliceBlue" BorderThickness="1" CornerRadius="2">
                <StackPanel Orientation="Horizontal" Margin="5">
                    <TextBox Text="{Binding ShiftValue, UpdateSourceTrigger=PropertyChanged}" Width="30" Margin="4" >
                        <TextBox.InputBindings>
                            <KeyBinding Command="{Binding ShiftCommand}" Key="Enter" />
                        </TextBox.InputBindings>
                    </TextBox>
                    <Button Content="Shift" Margin="0,4,0,4"
                            Command="{Binding ShiftCommand}"/>
                </StackPanel>
            </Border>
        </Setter.Value>
    </Setter>
</Style>

を開く方法は次のとおりPopupです。このメソッドはカスタムにあります( 2D配列から値を表示できるDataGridカスタムを使用しています):DataGrid

protected override void OnMouseRightButtonUp(System.Windows.Input.MouseButtonEventArgs e)
{
    if (!this.IsReadOnly)
    {
        this.shiftPopup.IsOpen = true;
    }
    base.OnMouseRightButtonUp(e);
}

ContextMenuここで、 に aを追加する必要がありDataGridます。ContextMenuに直接追加しようとするとDataGrid、グリッドが初期化される前に表示されますが、その後は のみがPopup表示されます。いいえContextMenu。同じ場所にあると思っていましたが、表示されContextMenuません。

理想的には、私が必要とするのは Office のようなものContextMenuです:

オフィスポップアップ

シフトポップアップがマウスポインターの上に表示ContextMenuされ、通常の位置に表示されます。

必要に応じて、固定レイアウト (上にレイアウト/下にコンテキスト メニュー、マウスの位置に関係なく) を使用してもかまいません。

そうする方法について何か考えがありますか?

あるいは、PopupcontextMenu にコンテンツを含めることを考えていました。

ご協力いただきありがとうございます!

4

1 に答える 1

1

ContextMenuアイデアは、デフォルトのテンプレートをオーバーライドすることです。

結果:

ここに画像の説明を入力

への参照を追加してPresentationFramework.Aero.dll、次のコードを試してください。

<Window 
    x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
    Title="MainWindow"
    Height="350" Width="525">

    <Window.Resources>
        <Style x:Key="MenuStyle" TargetType="{x:Type ContextMenu}" BasedOn="{StaticResource {x:Type ContextMenu}}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ContextMenu}">
                        <StackPanel>
                            <theme:SystemDropShadowChrome Name="Shdw2" Color="Transparent" SnapsToDevicePixels="true">
                                <Border Background="{TemplateBinding Background}"
                                        BorderBrush="{TemplateBinding BorderBrush}" 
                                        BorderThickness="{TemplateBinding BorderThickness}">
                                    <StackPanel Orientation="Horizontal">
                                        <TextBox Text="{Binding ShiftValue, UpdateSourceTrigger=PropertyChanged}"
                                                 Width="30" Margin="4">
                                            <TextBox.InputBindings>
                                                <KeyBinding Command="{Binding ShiftCommand}" Key="Enter" />
                                            </TextBox.InputBindings>
                                        </TextBox>
                                        <Button Content="Shift" Margin="0,4,0,4" Command="{Binding ShiftCommand}" />
                                    </StackPanel>
                                </Border>
                            </theme:SystemDropShadowChrome>

                            <theme:SystemDropShadowChrome Name="Shdw" Color="Transparent" SnapsToDevicePixels="true">
                                <Border Name="ContextMenuBorder"
                                        Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"
                                        BorderThickness="{TemplateBinding BorderThickness}">
                                    <Grid>
                                        <Rectangle Fill="#F1F1F1" HorizontalAlignment="Left" Width="28" Margin="2"
                                                   RadiusX="2" RadiusY="2" />
                                        <Rectangle HorizontalAlignment="Left" Width="1" Margin="30,2,0,2"
                                                   Fill="#E2E3E3" />
                                        <Rectangle HorizontalAlignment="Left" Width="1" Margin="31,2,0,2" Fill="White" />


                                        <ScrollViewer Name="ContextMenuScrollViewer" CanContentScroll="true"
                                                      Grid.ColumnSpan="2" Margin="1,0"
                                                      Style="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type FrameworkElement}, ResourceId=MenuScrollViewer}}">
                                            <Grid RenderOptions.ClearTypeHint="Enabled">
                                                <Canvas Height="0" Width="0" HorizontalAlignment="Left"
                                                        VerticalAlignment="Top">
                                                    <Rectangle
                                                        Height="{Binding ElementName=ContextMenuBorder,Path=ActualHeight}"
                                                        Width="{Binding ElementName=ContextMenuBorder,Path=ActualWidth}"
                                                        Fill="{Binding ElementName=ContextMenuBorder,Path=Background}" />
                                                </Canvas>
                                                <ItemsPresenter Name="ItemsPresenter"
                                                                Margin="{TemplateBinding Padding}" KeyboardNavigation.DirectionalNavigation="Cycle"
                                                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                            </Grid>
                                        </ScrollViewer>
                                    </Grid>
                                </Border>
                            </theme:SystemDropShadowChrome>
                        </StackPanel>
                        <ControlTemplate.Triggers>
                            <Trigger Property="HasDropShadow" Value="true">
                                <Setter TargetName="Shdw" Property="Margin" Value="0,0,5,5" />
                                <Setter TargetName="Shdw" Property="Color" Value="#71000000" />
                                <Setter TargetName="Shdw2" Property="Margin" Value="0,0,5,5" />
                                <Setter TargetName="Shdw2" Property="Color" Value="#71000000" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid>
        <DataGrid IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding}" />
            </DataGrid.Columns>

            <DataGrid.ContextMenu>
                <ContextMenu Style="{StaticResource MenuStyle}">
                    <MenuItem Header="Item 1"></MenuItem>
                    <MenuItem Header="Item 2"></MenuItem>
                    <MenuItem Header="Item 3"></MenuItem>
                </ContextMenu>
            </DataGrid.ContextMenu>

            <System:String>One</System:String>
            <System:String>Two</System:String>
            <System:String>Three</System:String>
        </DataGrid>
    </Grid>
</Window>
于 2012-10-19T04:31:08.170 に答える