2013-05-03 44 views
5

Bất cứ khi nào tôi cố gắng tạo cửa sổ và đặt SizeToContent thành WidthAndHeight, khi mở cửa sổ kích thước chính xác thành nội dung, nhưng nó sẽ thêm đường viền nhỏ ở bên phải và dưới cùng. Ngày thay đổi kích thước này biến mất, và khi sử dụng một thiết lập chiều cao và chiều rộng vấn đề này cũng không xảy ra.SizeToContent vẽ đường viền không mong muốn

Đây là một mẫu của những gì tôi có nghĩa là:

enter image description here

Bạn có thể nói đây không phải là một vấn đề rất lớn, mặc dù tôi thấy nó làm cho ứng dụng của tôi trông không chuyên nghiệp, đặc biệt là khi tôi cần phải trình bày này. Có ai biết tại sao điều này đang xảy ra, hoặc liệu có cách giải quyết nào không? Tôi đang mã hóa dự án này trong C#.

XAML Code:

<Window x:Class="FPricing.InputDialog" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="InputDialog" Width="400" Height="300" SizeToContent="WidthAndHeight"> 
    <StackPanel> 
     <Label x:Name="question">?</Label> 
     <TextBox x:Name="response"></TextBox> 
     <Button Content="OK" IsDefault="True" Click="Button_Click" /> 
    </StackPanel> 
</Window> 

Các giá trị được truyền vào việc tạo ra các lớp.

Tuy nhiên, tôi gặp sự cố này trên mọi cửa sổ tôi đã từng tạo, ngay cả khi không có mã cơ bản tùy chỉnh.

+0

Chúng tôi có thể xem Xaml không? –

+0

Hiển thị cho chúng tôi mã bạn có cho sự kiện mở và có thể có sự cố trong đó –

+0

Xaml vừa thêm – Kryptoxx

Trả lời

2

Sử dụng this tool (đó là tốt, btw) tôi thấy rằng các Border kiểm soát của số Window (nó là con ngay lập tức) không điền vào toàn bộ cửa sổ, để lại "biên giới", mà thực sự là nền tảng của điều khiển Window.

Tôi đã tìm thấy giải pháp thay thế. WidthHeight trong số BorderNaN. Nếu bạn đặt chúng thành một giá trị số nguyên, "border" biến mất.

Hãy sử dụng các giá trị ActualWidthActualHeight, nhưng được làm tròn thành số nguyên.

Xác định công cụ chuyển đổi:

C#

[ValueConversion(typeof(double), typeof(double))] 
public class RoundConverter : IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     return Math.Ceiling((double)value); 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     return value; 
    } 
} 

XAML (nhớ để bao gồm không gian tên của bạn, trong trường hợp này "c")

<c:RoundConverter x:Key="RoundConverter"/> 

Sau đó, tạo ra một phong cách ràng buộc kích thước để kích thước thực tế bằng cách sử dụng bộ chuyển đổi. Điều quan trọng là bạn phải sử dụng khóa, vì vậy nó sẽ không áp dụng cho mọi Border (hầu hết các điều khiển sử dụng nó):

<Style TargetType="{x:Type Border}" x:Key="WindowBorder"> 
    <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth, Converter={StaticResource RoundConverter}}"/> 
    <Setter Property="Height" Value="{Binding RelativeSource={RelativeSource Self}, Path=ActualHeight, Converter={StaticResource RoundConverter}}"/> 
</Style> 

Cuối cùng, áp dụng phong cách này cho đứa con đầu lòng của cửa sổ (các Border điều khiển):

private void Window_Loaded(object sender, RoutedEventArgs e) { 
    GetVisualChild(0).SetValue(StyleProperty, Application.Current.Resources["WindowBorder"]); 
} 

Nếu ai đó có thể thực hiện việc này theo cách đơn giản hơn, vui lòng chia sẻ.

0

Được rồi, đây là câu trả lời có liên quan mà bạn có thể tham khảo một câu trả lời tuyệt vời.

Automatic resizing when border content has changed

Vì vậy, về cơ bản bạn muốn thêm một cái gì đó như thế này, nhưng đặt nó vào giá trị mà bạn muốn:

<Border x:Name="border" 
      BorderBrush="Cornsilk" 
      BorderThickness="1"> 
     <Ellipse Width="40" 
       Height="20" 
       Fill="AliceBlue" 
       Stroke="Black" /> 
    </Border> 
+0

Cảm ơn bạn vì điều này, việc này sẽ loại bỏ đường viền ở kích thước phù hợp chứ không phải đường viền ở dưới cùng. Tuy nhiên đây không phải là một vấn đề lớn đối với tôi vì điều này không thực sự quá tệ. Phản ứng nhanh này được đánh giá rất cao! – Kryptoxx

+0

Không vấn đề gì, vui mừng được giúp đỡ :) –

4

<Window UseLayoutRounding="True" /> phù hợp với tôi.

+2

Mặc dù mẫu mã này có thể trả lời được câu hỏi, bạn nên đưa ra một số giải thích cần thiết cho câu trả lời của mình. Vì nó đứng ngay bây giờ câu trả lời này thêm ít hoặc không có giá trị cho độc giả trong tương lai. –

+0

@Gabriel sử dụng làm tròn cho chỉ một Border, UseLayoutRounding sẽ làm tròn toàn bộ cửa sổ. – smg

1

được quản lý để giải quyết, bằng cách kết hợp câu trả lời của Gabriel và smg. Khi tải cửa sổ, lấy đường viền được đề cập và đặt LayoutRounding thành true.

this.Loaded += (sender, args) =>   
{ 
    var border = this.GetVisualChild(0) as Border; 
    if (border != null) 
     border.UseLayoutRounding = true; 
}; 
Các vấn đề liên quan