求C# wpf中grid控件的 Margin 属性详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求C# wpf中grid控件的 Margin 属性详解相关的知识,希望对你有一定的参考价值。

C# wpf中grid控件的 Margin 属性,比如Margin="528,-10,-528,10",那这些数字分别表示什么?他是坐标和长宽的综合表示?

参考技术A 表示元素四周的边距,参考msdn:

https://msdn.microsoft.com/zh-cn/library/system.windows.frameworkelement.margin.aspx
https://msdn.microsoft.com/zh-cn/library/system.windows.thickness.aspx
参考技术B 表示grid在容纳他的控件 里面左上右下的距离 参考技术C Margin是用来设置控件本身相对于父控件的相对位置。
比如Margin="528,-10,-528,10"
表示该控件,相对于父控件上右下左的距离,负数表示会超出父控件的范围
参考技术D 上边距,右边距,下边距,左边距追问

以什么为标准?

追答

相对于存放它的容器,默认像素点

追问

怎么赋值? button1.Margin.Top=10 这样为什么报错

如何在没有名称属性的情况下在 c# 中获得具有相同父级的 WPF 的其他控件?

【中文标题】如何在没有名称属性的情况下在 c# 中获得具有相同父级的 WPF 的其他控件?【英文标题】:How to get the other control of WPF having same parent in c# without its name proprty? 【发布时间】:2016-09-25 04:46:44 【问题描述】:

我在 XAML 中有以下代码 sn-p。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="01*"/>
        <ColumnDefinition Width="01*"/>
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="1" Text="ABC" Name="txtBlockABC"/>
    <TextBlock Grid.Column="2" Text="DEF"/>
</Grid>

我想通过其他TextBlock 的名称(即txtBlockABC)在C# 中使用Text = "DEF" 访问TextBlock

我尝试了以下方法。

TextBlock txtBlockDEF = (TextBlock) ((Grid) (txtBlock1stPlane.Parent)).Children[1];

但它使用索引而不是Text 属性进行访问。

我想要Lamba Expression 之类的东西。喜欢:

TextBlock txtBlockDEF = (List<TextBlock>) ((Grid) (txtBlock1stPlane.Parent)).Children.All().Where(x => x.Text = "DEF").ToList()[0];

更新:

这样做的目的是将所选TextBlockText 与其相邻的TextBlock 交换。

【问题讨论】:

“我想通过其他TextBlock的名称(即txtBlockABC)在C#中访问Text=“DEF”的TextBlock。” -- 为什么?你打算用它做什么?您的问题几乎没有细节,它缺乏一个很好的minimal reproducible example 清楚地说明您的情况。但是您的问题给人留下了深刻的印象,即您的基本设计存在缺陷。您应该主要通过绑定到视图模型中的属性和/或通过使用样式和相关功能来操作您的 UI 元素,例如 TextBlock 如果您提供一个好的代码示例并解释您的更广泛目标是什么,您将有更好的机会获得一个实际上与精心设计的程序一致的好、有用的答案。 【参考方案1】:

这样做的目的是将所选TextBlock的Text与其相邻的TextBlock交换”

正如我所怀疑的,你肯定做错了。

你应该有一个视图模型。该视图模型应该有两个属性,它们代表两个 TextBlock 元素显示的文本。每个元素都应该将它们的Text 属性绑定到适当的视图模型属性。然后,当您想要交换值时,只需交换视图模型(您可以直接访问)上的值。

如果没有好的Minimal, Complete, and Verifiable code example,就不可能就您自己的代码提供任何具体的建议。但这是基本的想法:

class MyViewModel : INotifyPropertyChanged

    private string _text1;
    private string _text2;

    public string Text1
    
        get  return _text1; 
        set  _UpdateField(ref _text1, value); 
    

    public string Text2
    
        get  return _text2; 
        set  _UpdateField(ref _text2, value); 
    

    public ICommand SwapValues  get; 

    public MyViewModel()
    
        SwapValues = new SwapValuesCommand(this);
    

    private class SwapValuesComand : ICommand
    
        private readonly MyViewModel _owner;

        public SwapValuesCommand(MyViewModel owner)
        
            _owner = owner;
        

        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter)  return true; 

        public void Execute(object parameter)
        
            string temp = _owner.Text1;

            _owner.Text1 = _owner.Text2;
            _owner.Text2 = temp;
        
    

    public event PropertyChangedEventHandler PropertyChanged;

    private void _UpdateField<T>(ref T field, T newValue, [CallerMemberName] string propertyName = null)
    
        if (!EqualityComparer<T>.Default.Equals(field, newValue))
        
            field = newValue;
            PropertyChanged?.DynamicInvoke(this, new PropertyChangedEventArgs(propertyName));
        
    

然后在您的 XAML 中,类似:

<Button Content="Swap Values" Command="Binding SwapValues"/>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="01*"/>
        <ColumnDefinition Width="01*"/>
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="1" Text="Binding Text1" Name="txtBlockABC"/>
    <TextBlock Grid.Column="2" Text="Binding Text2"/>
</Grid>

上述所有 XAML 的 DataContextMyViewModel 类的实例。

单击标记为“交换值” 的按钮将执行SwapValuesCommand.Execute() 方法,该方法将交换值。 UI 元素的属性会自动更新。

我在这里展示了使用 ICommand 来执行交换,但当然你可以将它与你想要的任何逻辑挂钩。

警告:以上内容都是直接输入到网络浏览器中的。我什至没有编译它,没关系对其进行测试或检查拼写错误等。这只是为了说明。我相信您可以使用它和其他 WPF/MVVM 示例来了解此处使用的基本设计概念并调整您的程序设计,使其按预期方式工作。

当然,如果一切都失败了,我想你可以继续为TextBlock 命名。然后,您可以继续直接访问它。这是一种不明智的方法,但它肯定比尝试浏览可视化树、寻找TextBlock 并希望你找到正确的选择更好。

【讨论】:

【参考方案2】:
private void Button_Click(object sender, RoutedEventArgs e)

    TextBlock t = ((Grid)LogicalTreeHelper.GetParent(txtBlockABC))
                  .Children.OfType<TextBlock>()
                  .FirstOrDefault((tb) =>  return tb.Text == "DEF"; );

    string dummy = txtBlockABC.Text;
    txtBlockABC.Text = t.Text;
    t.Text = dummy;

【讨论】:

以上是关于求C# wpf中grid控件的 Margin 属性详解的主要内容,如果未能解决你的问题,请参考以下文章

WPF C# 如何在动态添加的grid控件中添加某个网格中的image控件的单击事件?

c# WPF 中把grid控件分成了2*2的四小块,每块中显示传过来的视频,要是传过来7个视频,我就得实现翻页,

WPF中Grid容器中VerticalAlignment和HorizonAlignment和Margin的关系。

C# wpf 实现任意控件拖动

C# wpf怎么在grid添加自定义控件时显示滚动条

C# wpf 想让控件随着窗口大小变化而变化