在WPF中使用SizeToContent = widthandHeight和WindowStartupLocation时发生冲突

时间:2014-09-23 10:32:52

标签: c# wpf sizetocontent

我们一直坚持在WPF中正确使用SizeToContent = WidthandHeight和WindowStartupLocation = CenterScreen的问题。调整大小后,我们的窗口有一个奇怪的黑色边框,它不在中心。

2 个答案:

答案 0 :(得分:0)

我们用这门课解决了这个问题。 所以你应该使用它而不是常见的Window

public class CustomizableChromeWindow : Window, INotifyPropertyChanged
        {

            protected override void OnStateChanged(EventArgs e)
            {
                base.OnStateChanged(e);
                OnPropertyChanged("CaptionButtonMargin");
            }

            public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
                HandleSizeToContent();
            }
            private void HandleSizeToContent()
            {
                if (this.SizeToContent == SizeToContent.Manual)
                    return;

                var previosTopXPosition = this.Left;
                var previosTopYPosition = this.Top;
                var previosWidth = this.MaxWidth;
                var previosHeight = this.MaxHeight;

                var previousWindowStartupLocation = this.WindowStartupLocation;
                var previousSizeToContent = SizeToContent;
                SizeToContent = SizeToContent.Manual;
                Dispatcher.BeginInvoke(
                DispatcherPriority.Loaded,
                (Action)(() =>
                {
                    this.SizeToContent = previousSizeToContent;

                    this.WindowStartupLocation = WindowStartupLocation.Manual;

                    this.Left = previosTopXPosition + (previosWidth - this.ActualWidth)/2;
                    this.Top = previosTopYPosition + (previosHeight - this.ActualHeight) / 2;
                    this.WindowStartupLocation = previousWindowStartupLocation;
                }));
            }
            public Thickness CaptionButtonMargin
            {
                get
                {
                    return new Thickness(0, 0, 0, 0);
                }
            }

            #region INotifyPropertyChanged
            private void OnPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }

            public event PropertyChangedEventHandler PropertyChanged;
            #endregion
        }

答案 1 :(得分:0)

在给出MaxWith和MaxHeight之前,代码不起作用。 为了解决这个问题,我使用了RestoreBounds:

var previosWidth = this.RestoreBounds.Width;
var previosHeight = this.RestoreBounds.Height;