WPF 点击 userControl
WPF Click on userControl
我想让容器 window 内的任何网格行都可以点击。
每行都是一个名为 "MyBookControl" 的用户控件。
单击 userControl 时,我想发出命令 "DownloadCommand"。
我正在使用 mvvm 模式。
图书控制:
<UserControl x:Name="MyBookControl" />
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Opacity" Value="0.6"></Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="1"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Label Grid.Row="0">Title</Label>
<Label Grid.Row="1">Author</Label>
<Label Grid.Row="2">Description</Label>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Title}"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Author}"/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Description}"/>
<Button Grid.Column="2" Grid.RowSpan="3" Command="{Binding DownloadCommand}" Content="Download" />
<Ellipse Grid.Column="3"
Height="20" Width="20"
Stroke="Black"
StrokeThickness="0.5"
HorizontalAlignment="Center"
Grid.Row="1"
/>
<Controls:PieSlice Grid.Column="3" Grid.Row="1" Stroke="Black" Fill="Black"
Height="20" Width="20"
StartAngle="0" EndAngle="{Binding Percent}"
HorizontalAlignment="Center" />
</Grid>
</UserControl>
据我了解,您想构建一个响应式面板来容纳所有 collection 成员。您可以尝试使用 listView 控件,并将您的用户控件作为 ListViewItem 的项模板。那里的房子有 select 功能 (ListView)。通过这种方式,ListView 可以通过一堆 object 绑定到您的主视图模型,并且每个用户控件都可以绑定到单个 object.
<ListView ItemsSource="{Binding ToYourSourceCollection}">
<ListView.ItemTemplate>
<DataTemplate>
<YourUserControl/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
然后您可以构建一个围绕 ListView 事件工作的行为,或者只监听选定的 属性 更改。
我想让容器 window 内的任何网格行都可以点击。 每行都是一个名为 "MyBookControl" 的用户控件。 单击 userControl 时,我想发出命令 "DownloadCommand"。 我正在使用 mvvm 模式。
图书控制:
<UserControl x:Name="MyBookControl" />
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Opacity" Value="0.6"></Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="1"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</Grid.Style>
<Label Grid.Row="0">Title</Label>
<Label Grid.Row="1">Author</Label>
<Label Grid.Row="2">Description</Label>
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Title}"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Author}"/>
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Description}"/>
<Button Grid.Column="2" Grid.RowSpan="3" Command="{Binding DownloadCommand}" Content="Download" />
<Ellipse Grid.Column="3"
Height="20" Width="20"
Stroke="Black"
StrokeThickness="0.5"
HorizontalAlignment="Center"
Grid.Row="1"
/>
<Controls:PieSlice Grid.Column="3" Grid.Row="1" Stroke="Black" Fill="Black"
Height="20" Width="20"
StartAngle="0" EndAngle="{Binding Percent}"
HorizontalAlignment="Center" />
</Grid>
</UserControl>
据我了解,您想构建一个响应式面板来容纳所有 collection 成员。您可以尝试使用 listView 控件,并将您的用户控件作为 ListViewItem 的项模板。那里的房子有 select 功能 (ListView)。通过这种方式,ListView 可以通过一堆 object 绑定到您的主视图模型,并且每个用户控件都可以绑定到单个 object.
<ListView ItemsSource="{Binding ToYourSourceCollection}">
<ListView.ItemTemplate>
<DataTemplate>
<YourUserControl/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
然后您可以构建一个围绕 ListView 事件工作的行为,或者只监听选定的 属性 更改。