2017-10-01 3 views
-2

J'essaie de lier la couleur à mon arrière-plan UserControl de la propriété double modifiée par le convertisseur. Cependant, pour une raison quelconque, ce n'est pas un travail. Il ne se casse jamais si j'ai un point d'arrêt dans ma fonction de conversion.Lier la couleur à l'arrière-plan dans WPF

Il existe un bouton qui active la fonction qui définit la propriété PaceLabel.Speed de la zone de texte lors d'un clic. Cette partie fonctionne correctement de sorte que je n'ai pas copié coller cette partie du code ici.

est ici une partie de mon code:

OwnComponent.xaml

<UserControl x:Class="OwnComponentNs.OwnComponent" 
     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:OwnComponentNs" 
     mc:Ignorable="d" Width="Auto"> 
... 
<UserControl.Resources> 
    <local:DoubleToSolidColorBrushConverter x:Key="doubleToBackgroundConverter" /> 
</UserControl.Resources> 
<UserControl.Background> 
    <Binding ElementName="paceLabel" Path="Speed" Converter="{StaticResource doubleToBackgroundConverter}" /> 
</UserControl.Background> 

<local:PaceLabel x:Name="paceLabel" /> 
... 

OwnComponent.xaml.cs

namespace OwnComponentNs 
{ 
    public partial class OwnComponent : UserControl 
    { 
     public OwnComponent() 
     { 
      InitializeComponent(); 
     } 

    } 

    public class DoubleToSolidColorBrushConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      byte val = System.Convert.ToByte((double)value); 
      return new SolidColorBrush(Color.FromRgb(val, val, val)); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      return null; 
     } 
    } 

    public class PaceLabel : Label 
    { 
     private double _duration = 0; 
     private double _distance = 0; 
     private double _speed = 0; 

     public double Duration 
     { 
      get { return _duration; } 
      set { _duration = value; UpdateText(); } 
     } 

     public double Distance 
     { 
      get { return _distance; } 
      set { _distance = value; UpdateText(); } 
     } 

     public double Speed 
     { 
      get { return _speed; } 
      set { _speed = value; } 
     } 

     public PaceLabel() 
     { 
      UpdateText(); 
     } 

     private void UpdateText() 
     { 
      double pace = Distance == 0 ? 0 : TimeSpan.FromHours(Duration).TotalMinutes/Distance; 
      Content = Math.Round(pace, 2) + " min/km"; 
     } 

    } 
} 

S'il vous plaît laissez-moi savoir si vous avez besoin de plus de détails . Merci d'avance!

Répondre

0

Vous avez besoin de votre classe PaceLabel pour mettre en œuvre l'interface: INotifyPropertyChanged,

ou de réécrire ses propriétés comme DependencyProperties.

0

PaceLabel devrait implémenter INotifyPropertyChanged et PaceLabel.Speed devrait déclencher cet événement.