Tôi không nghĩ rằng có một cách dễ dàng để thoát khỏi rằng trắng Border. Các thói quen thực tế được gọi là DrawInnerBorder và được gọi từ bên trong OnRender trong ButtonChrome.
protected override void OnRender(DrawingContext drawingContext)
{
Rect bounds = new Rect(0.0, 0.0, base.ActualWidth, base.ActualHeight);
this.DrawBackground(drawingContext, ref bounds);
this.DrawDropShadows(drawingContext, ref bounds);
this.DrawBorder(drawingContext, ref bounds);
// This one draws the white Rectangle
this.DrawInnerBorder(drawingContext, ref bounds);
}
private void DrawInnerBorder(DrawingContext dc, ref Rect bounds)
{
if ((base.IsEnabled || this.RoundCorners) && ((bounds.Width >= 4.0) && (bounds.Height >= 4.0)))
{
Pen innerBorderPen = this.InnerBorderPen;
if (innerBorderPen != null)
{
dc.DrawRoundedRectangle(null, innerBorderPen, new Rect(bounds.Left + 1.5, bounds.Top + 1.5, bounds.Width - 3.0, bounds.Height - 3.0), 1.75, 1.75);
}
}
}
Như chúng ta có thể thấy, không có thuộc tính để tắt tính năng này. Bạn có thể xác minh bằng cách đặt IsEnabled="False"
và RoundCorners="False"
trên ButtonChrome hoặc bằng cách đặt Chiều rộng hoặc Chiều cao thành khoảng 3,99 và "Đường viền màu trắng" biến mất.
Cập nhật
Để tắt đường viền bên trong của ButtonChrome, bạn có thể tạo ButtonChrome của riêng bạn để thêm thuộc tính này. Thật không may ButtonChrome được niêm phong vì vậy chúng tôi không thể kế thừa từ nó. Tôi đã cố gắng để sao chép toàn bộ lớp và thêm Property DisableInnerBorder và nó có vẻ là làm việc.Bạn có thể sử dụng nó như thế này
<local:MyButtonChrome ...
DisableInnerBorder="True">
Khác hơn là nó hoạt động giống như ButtonChrome thông thường và bạn cũng có thể thêm các Thuộc tính khác mà bạn có thể muốn. Có thể có những hạn chế đối với phương pháp này mà tôi đã không nghĩ đến, nhưng đối với một thử nghiệm nhỏ, nó hoạt động tốt.
apperently 937 dòng mã là quá nhiều để viết về SO :) Tôi đã tải lên MyButtonChrome.cs đây: http://www.mediafire.com/?wnra4qj4qt07wn6
Nguồn
2010-12-29 13:01:12
Bạn có thể lấy mã này bằng cách nào? Nó surpises tôi :) –
@Nam Gi VU: Tôi đã sử dụng .NET Reflector và thêm vào Assembly PresentationFramework.Aero để gỡ lỗi. Sau đó, tôi chỉ cần bước qua các thói quen vẽ để tìm ra nơi này đã được rút ra và kiểm tra nếu có một số cách để vô hiệu hóa nó :) –
Cảm ơn bạn Meleak! Giới thiệu về đề xuất của bạn để sử dụng 'Border' thay vì' ButtonChrome', tôi sẽ mất tất cả hiệu ứng giao diện người dùng của một nút thông thường (di chuột qua, nhấn, ect.) Bạn có bất kỳ công việc nào không? –