正如我在标题中所说,我需要在按下关闭按钮时关闭按钮交互的堆栈面板项目。但我是 wpf 的新手,无法理解如何将堆栈面板或按钮与特定的堆栈面板项目绑定。你能帮帮我吗?
`<DataTemplate x:Key="fixTemplate">
<Grid Background="Transparent" VerticalAlignment="Center" HorizontalAlignment="Center">
<StackPanel x:Name="fixPanel" MouseWheel="StackPanel_MouseWheel">
<Border BorderThickness="1" CornerRadius="10" Opacity="1.0" Background="{dxi:ThemeResource {dxmt:MapBrushesThemeKey ResourceKey=OverlayBackground}}">
<StackPanel Orientation="Vertical" Margin="8">
<Button x:Name="fixButton" Uid="0++" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}}" Content="X" Background="Red" Width="25" Height="25" HorizontalAlignment="Right" Click="fixButton_Click"/>
<TextBlock x:Name="fixText" Text="{Binding ToolTipText}" Foreground="{dxi:ThemeResource {dxmt:MapBrushesThemeKey ResourceKey=OverlayElementForeground}}" TextWrapping="Wrap"/>
</StackPanel>
</Border>
<Path Stretch="Fill"
Data="m 66.709675,141.93548 29.096774,-33 27.677421,33.35484 -18.80645,-0.35484 0.70968,43.29032 H 87.64516 l -0.709676,-43.29032 z"
HorizontalAlignment="Center"
Height="15"
Width="20"
UseLayoutRounding="False"
VerticalAlignment="Center"
Stroke="#BF000000"
StrokeThickness="0.4"
Margin="-13 0 0 0" >
<Path.Effect>
<DropShadowEffect ShadowDepth="2" BlurRadius="7" Opacity="0.5"/>
</Path.Effect>
<Path.Fill>
<RadialGradientBrush>
<GradientStop Color="Black" Offset="1." />
</RadialGradientBrush>
</Path.Fill>
</Path>
</StackPanel>
</Grid>
</DataTemplate>`
如您所见,我有一个按钮和动态创建的堆栈面板。如何删除单击按钮的堆栈面板?
我试图删除位于其删除按钮下方的堆栈面板,但我的代码中的每个堆栈面板都被删除了。我不知道如何指定在按下堆栈面板的关闭按钮时删除哪个堆栈面板
我试过的代码是这个
public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
yield return (T)child;
foreach (T childOfChild in FindVisualChildren<T>(child))
yield return childOfChild;
}
}
}
private void fixButton_Click(object sender, RoutedEventArgs e)
{
string tooltip = "";
List<string> ttlist = new List<string>();
foreach (var textblock in FindVisualChildren<TextBlock>(this))
{
if (textblock.Name == "fixText")
{
tooltip = textblock.Text;
ttlist.Add(tooltip);
}
break;
}
for (int i = 0; i < RealTimeMapDataGeneratorModel.sb.Count; i++)
{
System.Console.WriteLine(tooltip);
System.Console.WriteLine(RealTimeMapDataGeneratorModel.sb[i].ToolTipText);
if (ttlist[i] == RealTimeMapDataGeneratorModel.sb[i].ToolTipText)
{
//SubmarineVectorLayer.Visibility = Visibility.Hidden;
RealTimeMapDataGeneratorModel.Submarine.RemoveAt(i);
RealTimeMapDataGeneratorModel.sb.RemoveAt(i);
}
}
}
我通过在堆栈面板中添加复选框解决了这个问题
<Border BorderThickness="1" CornerRadius="10" Opacity="1.0" Background="{dxi:ThemeResource {dxmt:MapBrushesThemeKey ResourceKey=OverlayBackground}}">
<StackPanel Orientation="Vertical" Margin="8">
<CheckBox x:Name="MyCheckBox" IsChecked="True" HorizontalAlignment="Left"/>
<TextBlock Text="{Binding ToolTipText}" Visibility="{Binding IsChecked, ElementName=MyCheckBox, Converter={dxmvvm:BooleanToVisibilityConverter}}" Foreground="{dxi:ThemeResource {dxmt:MapBrushesThemeKey ResourceKey=OverlayElementForeground}}" TextWrapping="Wrap"/>
</StackPanel>
</Border>
模型视图中的这段代码
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var isChecked = (bool)value;
return isChecked ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}