Gtk# MessageDialog:消息过长时如何显示滚动条(设置最大行数)
解决Gtk# MessageDialog文本过长超出屏幕的问题
默认的Gtk.MessageDialog本身不会自动为过长文本添加滚动条,它内部使用普通Label部件,没有嵌套滚动容器,所以文本过多时会撑大窗口超出屏幕。你有两种可行的解决方式:
改造现有MessageDialog
可以手动获取MessageDialog内部的内容标签,将其放入ScrolledWindow中,同时限制滚动窗口的最大高度,避免超出屏幕。
修改你的代码如下:
private MainWindow(Builder builder) : base(builder.GetRawOwnedObject("MainWindow")) { builder.Autoconnect(this); DeleteEvent += Window_DeleteEvent; _button1.Clicked += Button1_Clicked; var lines = new List<string>(); for (int i = 0; i < 50; i++) { lines.Add("Line " + i); } var m = new Gtk.MessageDialog(this, DialogFlags.Modal, MessageType.Warning, ButtonsType.Cancel, string.Join("\r\n", lines) ); // 获取MessageDialog内部的内容标签 var contentArea = m.ContentArea; var label = contentArea.Children[0] as Gtk.Label; if (label != null) { // 移除原标签 contentArea.Remove(label); // 创建滚动窗口 var scrolledWindow = new Gtk.ScrolledWindow(); // 设置滚动窗口的最大高度为屏幕高度的80% var screenHeight = Gdk.Screen.Default.Height; scrolledWindow.MaxHeightRequest = (int)(screenHeight * 0.8); // 允许垂直滚动 scrolledWindow.Policy = Gtk.PolicyType.Automatic; // 将标签添加到滚动窗口 scrolledWindow.Add(label); // 将滚动窗口添加回内容区域 contentArea.Add(scrolledWindow); // 重新布局 contentArea.ShowAll(); } var res = m.Run(); m.Destroy(); }
自定义对话框
如果需要更灵活的布局控制,直接创建自定义Dialog是更稳妥的方式,完全由你控制内容区域的结构:
private void ShowLongTextDialog() { var lines = new List<string>(); for (int i = 0; i < 50; i++) { lines.Add("Line " + i); } // 创建自定义对话框 var dialog = new Gtk.Dialog("警告", this, DialogFlags.Modal); dialog.AddButton("取消", (int)ResponseType.Cancel); // 创建内容区域 var contentArea = dialog.ContentArea; var scrolledWindow = new Gtk.ScrolledWindow(); var screenHeight = Gdk.Screen.Default.Height; scrolledWindow.MaxHeightRequest = (int)(screenHeight * 0.8); scrolledWindow.Policy = Gtk.PolicyType.Automatic; var label = new Gtk.Label(string.Join("\r\n", lines)); label.Wrap = true; // 开启自动换行 scrolledWindow.Add(label); contentArea.Add(scrolledWindow); contentArea.ShowAll(); var res = dialog.Run(); dialog.Destroy(); }
两种方式都能实现文本过长时显示滚动条,同时限制对话框高度不超出屏幕。如果只是临时解决现有问题,改造MessageDialog更快捷;如果后续有更多自定义需求,推荐使用自定义对话框。
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

