6

Tôi có thanh tiến trình mà tôi muốn thay đổi màu tùy thuộc vào giá trị boolean; đúng là màu xanh lá cây và giả là màu đỏ. Tôi có mã mà có vẻ như nó sẽ làm việc (nó trả về giá trị chính xác khi tôi ràng buộc nó vào một hộp văn bản) nhưng không phải khi đó là thuộc tính màu sắc của thanh tiến trình. Bộ chuyển đổi được định nghĩa như thế này (trong App.xaml.cs kể từ khi tôi muốn truy cập nó bất cứ nơi nào):IValueConverter không hoạt động cho SolidColorBrush

public class ProgressBarConverter : System.Windows.Data.IValueConverter 
{ 
    public object Convert(
     object o, 
     Type type, 
     object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if (o == null) 
      return null; 
     else 
      //return (bool)o ? new SolidColorBrush(Colors.Red) : 
      //     new SolidColorBrush(Colors.Green); 
      return (bool)o ? Colors.Red : Colors.Green; 
    } 

    public object ConvertBack(
     object o, 
     Type type, 
     object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     return null; 
    } 
} 

sau đó tôi thêm dòng sau vào các App.xaml (vì vậy nó có thể là một nguồn tài nguyên toàn cầu):

<Application.Resources> 
    <local:ProgressBarConverter x:Key="progressBarConverter" /> 
    <DataTemplate x:Key="ItemTemplate"> 
     <StackPanel> 
      <TextBlock Text="{Binding name}" Width="280" /> 
      <TextBlock Text="{Binding isNeeded, 
          Converter={StaticResource progressBarConverter}}" /> 
      <ProgressBar> 
       <ProgressBar.Foreground> 
        <SolidColorBrush Color="{Binding isNeeded, 
          Converter={StaticResource progressBarConverter}}" /> 
       </ProgressBar.Foreground> 
       <ProgressBar.Background> 
        <SolidColorBrush Color="{StaticResource PhoneBorderColor}"/> 
       </ProgressBar.Background> 
      </ProgressBar> 
     </StackPanel> 
    </DataTemplate> 
</Application.Resources> 

tôi đã thêm dòng sau vào MainPage.xaml để hiển thị chúng:

<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <ListBox x:Name="listBox" 
      ItemTemplate="{StaticResource ItemTemplate}"/> 
</Grid> 

và sau đó trong MainPage.xaml.cs, tôi định nghĩa một lớp để giữ dữ liệu và ràng buộc nó vào ListBox:

namespace PhoneApp1 
{ 
    public class TestClass 
    { 
     public bool isNeeded { get; set; } 
     public string name { get; set; } 
    } 

    public partial class MainPage : PhoneApplicationPage 
    { 
     // Constructor 
     public MainPage() 
     { 
      InitializeComponent(); 

      var list = new LinkedList<TestClass>(); 
      list.AddFirst(
           new TestClass { 
            isNeeded = true, name = "should be green" }); 
      list.AddFirst(
           new TestClass { 
            isNeeded = false, name = "should be red" }); 
      listBox.ItemsSource = list; 
     } 
    } 
} 

Tôi đã đính kèm minimal working example để chỉ có thể xây dựng và thử nghiệm. Một hình ảnh của đầu ra là ở đây:

enter image description here

Nó trả về các giá trị từ bộ chuyển đổi cho hộp văn bản nhưng không phải là thanh tiến trình. Khi tôi chạy trình gỡ lỗi, nó thậm chí không gọi nó.

Cảm ơn bạn đã trợ giúp!

+0

Nó sẽ không hoạt động nếu bộ chuyển đổi của bạn trả về solidColorBrush, và bạn liên kết điều này với Thuộc tính ForeGround của ProgressBar của bạn trực tiếp? – BigL

+0

Chà - điều đó đã hiệu quả. Tôi vẫn nhận được hang của xaml, vì vậy đó không phải là một cái gì đó tôi đã cố gắng. Nếu bạn đặt nó như một câu trả lời tôi sẽ chấp nhận nó. Cám ơn vì sự gợi ý! –

+0

@TaylorSouthwick Hãy đăng câu trả lời này. Tôi rất vui vì tôi có thể giúp. :) – BigL

Trả lời

3

Cố gắng sửa đổi công cụ chuyển đổi của bạn để trả lại SolidColorBrush và sau đó liên kết trực tiếp với thuộc tính Foreground ProgressBars của bạn.

Các vấn đề liên quan