Appkit 对齐NSStackView中的控件

Appkit 对齐NSStackView中的控件,appkit,xamarin.mac,nsstackview,Appkit,Xamarin.mac,Nsstackview,我有一个NSWindows实现,用作模式授权对话框。守则: 使用系统; 使用AppKit; 利用开罗; 名称空间名称空间 { 公共类对话框窗口:NSWindow { 公共对话框窗口():base() { var stackView=new NSStackView(){ AutoresizingMask=NSViewResizingMask.HeightSizable | NSViewResizingMask.WidthSizable, }; stackView.WantsLayer=true;

我有一个NSWindows实现,用作模式授权对话框。守则:

使用系统;
使用AppKit;
利用开罗;
名称空间名称空间
{
公共类对话框窗口:NSWindow
{
公共对话框窗口():base()
{
var stackView=new NSStackView(){
AutoresizingMask=NSViewResizingMask.HeightSizable | NSViewResizingMask.WidthSizable,
};
stackView.WantsLayer=true;
stackView.Layer.BackgroundColor=新的CoreGraphics.CGColor(255f,0f,0f);
stackView.Alignment=nslayouttribute.Leading;
stackView.Orientation=NSUserInterfaceLayoutOrientation.Vertical;
ContentView=stackView;
SetFrame(newcoregraphics.CGRect(Frame.Location,newcoregraphics.CGSize(300210)),true);
StyleMask |=NSWindowsStyle.Closable;
}
公共对话框()
{
NSApplication.SharedApplication.RunModalForWindow(此);
}
}
公共类AuthDialog:DialogWindow
{
公共AuthDialog():base()
{
var usernamelab=new NSTextField(){
StringValue=“用户名”,
可编辑=假,
DrawsBackground=false,
可选=错误,
边框=假,
};
usernamelab.SizeToFit();
var usernameditor=new NSTextField();
var passwordLabel=new NSTextField(){
StringValue=“密码”,
可编辑=假,
DrawsBackground=false,
可选=错误,
边框=假,
};
passwordLabel.SizeToFit();
var passwordEditor=new NSSecureTextField();
var actionButtonsView=新的NSStackView(){
方向=NSUserInterfaceLayoutOrientation.水平,
};
actionButtonsView.WantsLayer=true;
actionButtonsView.Layer.BackgroundColor=新的CoreGraphics.CGColor(0f,255f,0f);
var cancelButton=new NSButton(){
Title=“取消”,
};
var loginButton=new NSButton(){
Title=“登录”,
};
actionButtonsView.TranslatesAutoResizengMaskintoConstraints=false;
actionButtonsView.AddArrangedSubview(取消按钮);
actionButtonsView.AddArrangedSubview(登录按钮);
loginButton.SizeToFit();
var stackView=(NSStackView)ContentView;
AddArrangedSubview(用户名标签);
AddArrangedSubview(用户名编辑器);
AddArrangedSubview(密码标签);
AddArrangedSubview(密码编辑器);
stackView.AddArrangedSubview(actionButtonsView);
ShowsResizeIndicator=false;
}
}
}
它只是创建基于StackView的布局。看起来是这样的:


问题是如何将最后一个子视图(包含按钮)与父视图(和窗口)的右侧对齐?编程语言并不重要。它很容易转换为swift\obj-c,反之亦然。

NSStackView使用自动布局系统。所以像sizetofit这样的东西可能不应该被使用。查看按钮上的Contenthuggingpriority和contentcompressionpriority以及stackview上的distribution以确定大小

替换

actionButtonsView.AddArrangedSubview(cancelButton);
actionButtonsView.AddArrangedSubview(loginButton);


现在我自己无法测试,可能还需要其他修改。

无法自定义NSStackView本身来实现这一点,每个视图都是前导、尾随或居中的

但是,可以向包含按钮的水平堆栈视图添加约束,并将其固定到封闭的垂直堆栈视图的尾部:

let cancelButton=NSButton(标题:“取消”,目标:无,操作:无)
让loginButton=NSButton(标题:“登录”,目标:nil,操作:nil)
//将内容包围设置得足够高,以便垂直堆栈视图不会
//拉伸按钮,使其沿前缘对齐
cancelButton.setContentHuggingPriority(.defaultHigh,用于:。水平)
loginButton.setContentHuggingPriority(.defaultHigh,用于:。水平)
//需要填充水平堆栈视图的分布
让horizontalStackView=NSStackView(视图:[取消按钮,登录按钮])
horizontalStackView.distribution=.fill
stackView.addArrangedSubview(水平stackView)
//将按钮固定到垂直堆栈视图的右(后)边缘
NSLayoutConstraint.activate([
水平stackView.trailingAnchor.constraint(等式:stackView.trailingAnchor)
])
或者,您可能希望尝试
NSGridView
来完成这样的布局。

它不起作用。
actionButtonsView.AddView(cancelButton, NSStackViewGravity.Trailing);
actionButtonsView.AddView(loginButton, NSStackViewGravity.Trailing);