求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];
更新:
这样做的目的是将所选TextBlock
的Text
与其相邻的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 的 DataContext
是 MyViewModel
类的实例。
单击标记为“交换值” 的按钮将执行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个视频,我就得实现翻页,