处理禁用的WPF StackPanel中的单击事件或MouseDown

时间:2013-05-22 10:54:49

标签: c# wpf click stackpanel disabled-control

我已经有一段时间我正在尝试做类似的事情而且我现在要抛出一个NotImplementedException ...我的意思是,扔掉毛巾。你是我最后的希望。

所以,我的目标是:当用户点击它时出于用户友好的目的启用StackPanel。

我在这个禁用的StackPanel中有一些项目,它位于窗口内网格内的ScrollViewer内。

我的代码中有一部分需要理解:

<Grid x:Name="MainGrid">
    <Grid.RowDefinitions>
        <RowDefinition MinHeight="30" MaxHeight="30"/>
        <RowDefinition MinHeight="22" MaxHeight="22"/>
        <RowDefinition MinHeight="155" Height="155"/>
        <RowDefinition MinHeight="130"/>
        <RowDefinition MinHeight="25" MaxHeight="25"/>
        <RowDefinition MinHeight="22" MaxHeight="22"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition MinWidth="355" Width="360" />
        <ColumnDefinition MinWidth="330" />
        <ColumnDefinition MinWidth="280" />
    </Grid.ColumnDefinitions>
    <ScrollViewer Grid.Column="2" Grid.Row="3" VerticalScrollBarVisibility="Auto">
        <StackPanel IsEnabled="False" IsEnabledChanged="ioStackPanel_IsEnabledChanged">
            <Grid Height="22">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="110"/>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="50"/>
                    <ColumnDefinition Width="50"/>
                    <ColumnDefinition Width="20"/>
                </Grid.ColumnDefinitions>
            </Grid>
        </StackPanel>
    </ScrollViewer>
</Grid>

我已经尝试了类似的东西:

<ScrollViewer Grid.Column="2" Grid.Row="3" VerticalScrollBarVisibility="Auto" MouseDown="ScrollViewer_MouseDown">

private void ScrollViewer_MouseDown(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("Well done bro!");
}

但没有提出任何问题。没有显示MessageBox。

2 个答案:

答案 0 :(得分:2)

以下代码正常运行,请关注它。

<Grid x:Name="MainGrid">
    <Grid.RowDefinitions>
        <RowDefinition MinHeight="30" MaxHeight="30" />
        <RowDefinition MinHeight="22" MaxHeight="22" />
        <RowDefinition Height="155" MinHeight="155" />
        <RowDefinition MinHeight="130" />
        <RowDefinition MinHeight="25" MaxHeight="25" />
        <RowDefinition MinHeight="22" MaxHeight="22" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="360" MinWidth="355" />
        <ColumnDefinition MinWidth="330" />
        <ColumnDefinition MinWidth="280" />
    </Grid.ColumnDefinitions>
    <ScrollViewer Grid.Row="3"
                  Grid.Column="2"
                  PreviewMouseLeftButtonDown="InnerPanel_PreviewMouseLeftButtonDown_1"
                  VerticalScrollBarVisibility="Auto">
        <StackPanel Name="InnerPanel"
                    Background="Gray"
                    IsEnabled="False"
                    IsEnabledChanged="StackPanel_IsEnabledChanged_1">
            <Grid>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="110" />
                    <ColumnDefinition />
                    <ColumnDefinition Width="50" />
                    <ColumnDefinition Width="50" />
                    <ColumnDefinition Width="20" />
                </Grid.ColumnDefinitions>
                <Button Grid.Column="2" Content="Inner Panel" />
            </Grid>
        </StackPanel>
    </ScrollViewer>
</Grid>


private void InnerPanel_PreviewMouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
    {

    }

这很好用,并在上面的事件中实现你的逻辑。

答案 1 :(得分:0)

不幸的是,当一个控件被禁用时,它会消耗它的所有事件并且什么都不做。

如何使用网格将其放在透明面板后面。当用户点击面板时,您隐藏面板并启用堆叠面板。

像...一样的东西。

<scrollviewer ...>
  <grid> <!--New grid just to align the two panels-->
     <stackpanel x:Name="enableMe" IsEnabled="False" ...>
        ....
     </stackpanel>
     <border x:name="hideMe" Background="Transparent" Click="EnableStackPanel" ZIndex="1"/>
 </grid>
</stackpanel>

public void EnableStackPanel(...)
{
  enableMe.IsEnabled=true;
  hideMe.Visibilty = Visibility.Collapsed;
}