首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在WPF中删除LineGraph周围的边框?

如何在WPF中删除LineGraph周围的边框?
EN

Stack Overflow用户
提问于 2019-11-07 08:17:49
回答 2查看 423关注 0票数 2

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

我试图移除图像周围的边框,并尝试了一些解决方案,如BorderBrush="Transparent" BorderThickness="0",但这些解决方案不起作用。我只想要橱窗里的图形部分。我正在提供XAMLCS代码。请帮我解决这个问题。

XAML :

代码语言:javascript
复制
<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:

代码语言:javascript
复制
    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;

        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-11 05:57:57

经过大量的搜索和实验,我找到了一个简单的解决方案。我们需要更改图表模板,只需在XAML文件和一个引用中添加以下代码:

代码语言:javascript
复制
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>
票数 2
EN

Stack Overflow用户

发布于 2019-11-08 16:29:46

此控件没有提供一种方便的方法来执行此操作。但无论如何,总有一种方法可以做到这一点,尽管这段代码会更加脆弱。

首先,可以使用Visual调试器探索控件的结构。在VS 2019年中,有:

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

还有很多其他类似的工具来自第三方。一旦您在结构中找到需要更改的控件(在本例中,它是EdgePanel中的一个边框)。然后,您可以从后面的代码中更改此控件。您不能在构造函数中这样做,因为视觉树尚未在构造时加载。你可以在上膛的时候做。因此,您需要订阅图表控件上加载的事件(也可能订阅LayoutUpdate事件,因为在布局更新时,它可以恢复其原始值)。函数FindVisualChild帮助在可视树中按类型和名称查找控件。当我们找到边框时,我们要么使其透明(更安全的选项),要么使其厚度为0,但它可能会影响布局。我们也可以移除它,但是依赖它的东西可能会被打破。请注意,如果您更改主题,此代码可能会停止工作,因为它可能有不同的视觉树。

代码语言:javascript
复制
    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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58744510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档