如何删除如图像所示的边框?

我试图移除图像周围的边框,并尝试了一些解决方案,如BorderBrush="Transparent" BorderThickness="0",但这些解决方案不起作用。我只想要橱窗里的图形部分。我正在提供XAML和CS代码。请帮我解决这个问题。
XAML :
<Window x:Class="WpfToolkitChart.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="308.796" Width="436.419" Background="White"
xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit">
<Window.Resources>
<Style x:Key="DataPointStyle1" TargetType="{x:Type chartingToolkit:LineDataPoint}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="chartingToolkit:LineDataPoint">
<Grid Margin="0,0,0,0">
<Ellipse Fill="#617D99" ToolTip="{Binding Y}"/>
<Canvas>
<Image Source="/Images/marker.png" Cursor="Hand" Height="40" Width="20" Margin="-6,-33,0,0" Visibility="{Binding BindingInfo}" ToolTip="You!!" />
<Ellipse Fill="{Binding Info}" Height="10px" Width="10px" Margin="0,-20,0,0" />
</Canvas>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="#33557A"></Setter>
</Style>
</Window.Resources>
<Grid Margin="0,0,0,0">
<chartingToolkit:Chart Name="lineChart" Title="" VerticalAlignment="Top" Margin="0,0,0,0" FontSize="10px" Height="269" Foreground="Black" Background="Transparent"
BorderBrush="Transparent">
<chartingToolkit:LineSeries Name="lp"
DependentValuePath="Y" Margin="0,0,0,0" IndependentValuePath="X"
ItemsSource="{Binding}" IsSelectionEnabled="True"
DataPointStyle="{StaticResource DataPointStyle1}">
</chartingToolkit:LineSeries>
<chartingToolkit:Chart.Axes>
<chartingToolkit:LinearAxis Orientation="Y" Visibility="Hidden"/>
</chartingToolkit:Chart.Axes>
<chartingToolkit:Chart.LegendStyle>
<Style x:Name="LegendHideStyle1" TargetType="Control">
<Setter Property="Width" Value="0"/>
<Setter Property="Height" Value="0"/>
</Style>
</chartingToolkit:Chart.LegendStyle>
<chartingToolkit:Chart.PlotAreaStyle>
<Style TargetType="Grid">
<Setter Property="Background" Value="Transparent" />
</Style>
</chartingToolkit:Chart.PlotAreaStyle>
</chartingToolkit:Chart>
</Grid>
</Window>CS:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
showColumnChart();
}
private void showColumnChart()
{
double y1 = 5, y2 = 1, y3 = 3, y4 =2;
ObservableCollection<MyDataModelClass> data = new ObservableCollection<MyDataModelClass>{
new MyDataModelClass {X = "A", Y = y1, BindingInfo = "Hidden" },
new MyDataModelClass {X = "B", Y = y2, BindingInfo = "Hidden" },
new MyDataModelClass {X = "C", Y = y3, BindingInfo = "Hidden" },
new MyDataModelClass {X = "D", Y = y4, BindingInfo = "Visible" }
};
double max = data.Max(m => m.Y);
double min = data.Min(m => m.Y);
double Percentage = 15;
double diff = max - min;
double percetage = (Math.Abs(diff) / 100) * Percentage;
double minVal = min - percetage;
double maxVal = max + percetage;
LinearAxis axis = new LinearAxis();
axis.Orientation = AxisOrientation.Y;
axis.Maximum = maxVal;
axis.Minimum = minVal;
axis.Visibility = Visibility.Hidden;
//and use it:
LineSeries ls = lineChart.Series.First() as LineSeries;
ls.DependentRangeAxis = axis;
//lineChart.Visibility = Visibility.Hidden;
ls.BorderBrush = Brushes.Transparent;
lineChart.DataContext = data;
}
}
}发布于 2019-11-11 05:57:57
经过大量的搜索和实验,我找到了一个简单的解决方案。我们需要更改图表模板,只需在XAML文件和一个引用中添加以下代码:
xmlns:chartingprimitives="clr-namespace:System.Windows.Controls.DataVisualization.Charting.Primitives;assembly=System.Windows.Controls.DataVisualization.Toolkit"
<chartingToolkit:Chart.Template>
<ControlTemplate TargetType="chartingToolkit:Chart">
<Border
BorderBrush="Transparent"
BorderThickness="0">
<Grid>
<chartingprimitives:EdgePanel x:Name="ChartArea" Style="{TemplateBinding ChartAreaStyle}">
<Grid Canvas.ZIndex="-1" Style="{TemplateBinding PlotAreaStyle}" />
</chartingprimitives:EdgePanel>
</Grid>
</Border>
</ControlTemplate>
</chartingToolkit:Chart.Template>发布于 2019-11-08 16:29:46
此控件没有提供一种方便的方法来执行此操作。但无论如何,总有一种方法可以做到这一点,尽管这段代码会更加脆弱。
首先,可以使用Visual调试器探索控件的结构。在VS 2019年中,有:

在以前的版本中,您可以在调试器中找到它:


还有很多其他类似的工具来自第三方。一旦您在结构中找到需要更改的控件(在本例中,它是EdgePanel中的一个边框)。然后,您可以从后面的代码中更改此控件。您不能在构造函数中这样做,因为视觉树尚未在构造时加载。你可以在上膛的时候做。因此,您需要订阅图表控件上加载的事件(也可能订阅LayoutUpdate事件,因为在布局更新时,它可以恢复其原始值)。函数FindVisualChild帮助在可视树中按类型和名称查找控件。当我们找到边框时,我们要么使其透明(更安全的选项),要么使其厚度为0,但它可能会影响布局。我们也可以移除它,但是依赖它的东西可能会被打破。请注意,如果您更改主题,此代码可能会停止工作,因为它可能有不同的视觉树。
void LineChart_OnLoaded(object sender, RoutedEventArgs e) {
if (sender is Chart chart) {
RemoveBorder(chart);
}
}
void RemoveBorder(Chart chart) {
EdgePanel ep = FindVisualChild<EdgePanel>(chart, "ChartArea");
Border border = FindVisualChild<Border>(ep);
border.BorderBrush = Brushes.Transparent;
}
static T FindVisualChild<T>(DependencyObject obj, string name = null) where T : FrameworkElement {
int childrenCount = VisualTreeHelper.GetChildrenCount(obj);
for (int i = 0; i < childrenCount; i++) {
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child is T element && (name == null || name == element.Name)) {
return element;
}
T childOfChild = FindVisualChild<T>(child, name);
if (childOfChild != null) {
return childOfChild;
}
}
return null;
}https://stackoverflow.com/questions/58744510
复制相似问题