2016-04-01 19 views
2

titreşir yapar, neden metin tasarım modunda titreşir yok ?.
arkasında Video of issueNeden bir pencereye benim usercontrol eklediğinizde UserControl textblock tasarım modunda

<UserControl x:Class="AircraftGauges.InnerGauge" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:AircraftGauges" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="200" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <UserControl.Resources> 
     <local:CenterConverter x:Key="CenterConverter"/> 
    </UserControl.Resources> 
    <Canvas Width="200" Height="200" Background="White"> 
     <Path Stroke="Black" StrokeThickness="1" Data="M 40, 95 V 105 H 160 V 95 H 105 V 85 H 95 V 95 Z " Fill="Black"/> 
     <TextBlock Name="CenterLabel" Text="{Binding PathData}" Foreground="Black" VerticalAlignment="Center" 
         Canvas.Left="100" Canvas.Top="112"> 
      <TextBlock.Margin> 
       <MultiBinding Converter="{StaticResource CenterConverter}"> 
        <Binding ElementName="CenterLabel" Path="ActualWidth"/> 
        <Binding ElementName="CenterLabel" Path="ActualHeight"/> 
       </MultiBinding> 
      </TextBlock.Margin> 
     </TextBlock> 
    </Canvas> 
</UserControl> 

Kodu: InnerGauge.xaml.cs:

namespace AircraftGauges 
{ 
    /// <summary> 
    /// Interaction logic for InnerGauge.xaml 
    /// </summary> 
    public partial class InnerGauge : UserControl, INotifyPropertyChanged 
    { 
     private string _path; 

     public event PropertyChangedEventHandler PropertyChanged; 

     public InnerGauge() 
     { 
      InitializeComponent(); 

      SizeChanged += SizeChangedEventHandler; 
     } 

     private void SizeChangedEventHandler(object sender, SizeChangedEventArgs e) 
     { 
      UpdatePathData(e.NewSize.Width, e.NewSize.Height); 
     } 

     private void UpdatePathData(double w, double h) 
     { 
      var newPath = $"W {w} -- H {h}"; 

      if (String.CompareOrdinal(_path, newPath) != 0) 
      { 
       _path = newPath; 
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(PathData))); 
      } 
     } 

     public string PathData 
     { 
      get 
      { 
       return _path; 
      } 
     } 
    } 
} 

CenterConverter.cs gerçekten

namespace AircraftGauges 
{ 
    public class CenterConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
     { 
      if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue) 
      { 
       return DependencyProperty.UnsetValue; 
      } 

      var width = (double) values[0]; 
      var height = (double) values[1]; 

      return new Thickness(-width/2, -height/2, 0, 0); 
     } 

     public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

} 
+0

Nasıl titreşir? Ne oluyor? – dkozl

+1

Sismik olarak aktif bir bölgede yaşıyor musunuz? –

+0

Soldan sağa titreşir. Gif/videom var, ancak yüklenmesi biraz fazla büyük. Bence merkezleme nedeniyle –

cevap

1

İlginç vaka ve nedeni düzeni yuvarlama olduğunu. Wpf tasarımcısı varsayılan olarak, içinde görüntülediğiniz pencere için UseLayoutRounding değerini true olarak ayarlar. Ancak, çalışma zamanında UseLayoutRounding, pencere için yanlıştır. Hangi düzen yuvarlama araçları, width/height \ marjları gibi şeylerdir, pafta ölçümü sırasında tüm piksele yuvarlanır. CenterConverter'inizde, kendi yükseklik ve genişliğine bağlı olarak textblock kenar boşluğunu hesaplarsınız. Ancak değişen marj genişlik değişikliğine neden olur ve bu da marj değişikliğine neden olur. Düzen yuvarlama nedeniyle bu süreç asla bitmez.

Sen (tasarımcı titreşimli duracaktır) açıkça UseLayoutRounding = false ayarlayarak ya da (yürütmesinde titrer) açıkça true ayarlayarak doğrulayabilir. Genel olarak, bunu dikkate almak için CenterConverter'i düzeltmeniz gerekir.

+0

Damnit eklenmiştir, sadece düzeltmek yerine sadece yuvarlama açıklaması için +1 değil ... ve bu notta, dönüştürücünün düzenini tamamlamasının gerekmediğine bahse girerim ' sonra tekrar. İyi hafta sonları dostum –

İlgili konular