簡體   English   中英

單擊WP7上的列表框項目更改

[英]Listbox item change on click WP7

我在WP7中有一個綁定列表框,其中包含每個部分中的一組項目,我想在單擊時更改圖標的路徑,以便更改單擊的圖標。 這是我的XAML數據,需要在點擊按鈕上更改Italic和Bold中的Stackpanel。

   <ListBox Height="768" HorizontalAlignment="Left" Name="listBox1" Margin="0,0,0,0" 
            VerticalAlignment="Top" Width="480" Grid.RowSpan="2" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Button BorderBrush="Black" Width="460" Height="100">
                    <Button.Content>
                        <StackPanel Orientation="Horizontal" Height="80" Width="400">
                            <Image Source="{Binding Image}" Width="80" Height="50"/>
                            <StackPanel Orientation="Vertical" Height="80">
                                <StackPanel Orientation="Horizontal" Height="40">
                                    <TextBlock Width="200" FontSize="28" Text="{Binding Name}" Height="50"/>
                                    <StackPanel Orientation="Horizontal">
                                        ***<Image Source="{Binding OnOff}" Width="100" Height="40" Tap="Image_Tap"/>***
                                        </StackPanel>
                                </StackPanel>
                            </StackPanel>
                        </StackPanel>
                    </Button.Content>
                </Button>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

我已經用這種方式填充了這個列表框

     void MainPage_Loaded(object sender, RoutedEventArgs e)
     {
        List<settings> settingsData = new List<settings>();

        settingsData.Add(new settings("Administrator","Images/ad.png",""));
        settingsData.Add(new settings("Wi-Fi","Images/wifi.png","Images/off.png"));
        settingsData.Add(new settings("Bluetooth", "Images/BlueTooth.png", "Images/On.png"));
        settingsData.Add(new settings("Airplane Mode", "Images/747.png", "Images/off.png"));
        settingsData.Add(new settings("VPN", "", ""));
        settingsData.Add(new settings("Hotspot", "", "Images/unchecked.png"));
        settingsData.Add(new settings("NFC", "", "Images/checked.png"));
        settingsData.Add(new settings("Sound","Images/sound.png",""));
        settingsData.Add(new settings("Display","Images/display.png",""));

        listBox1.ItemsSource = settingsData;
    }

請幫助..!!

由於您已將Image綁定到settings對象的Image屬性,只需更改其中的路徑( settings.Image = "Images/newImage.png" ),列表應該選擇對圖像路徑的更改。

為此,請訂閱OnMouseLeftButtonDownOnMouseLeftButtonUp事件。

編輯您也可以將OnOff屬性作為bool類型並為此提供轉換器。 通常,所有項目的開啟和關閉圖標都相同(提供UI一致性)。 這是轉換器類:

public class OnOffImageConverter : IValueConverter
    {
    public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
        {
        if ((bool)value)
            {
            return new BitmapImage (new Uri ("Images/On.png", UriKind.Relative));
            }
        else
            {
            return new BitmapImage (new Uri ("Images/Off.png", UriKind.Relative));
            }
        }

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

在xaml中為轉換器定義靜態資源:

<UserControl.Resources>
    <instance:OnOffImageConverter x:Key="OnOff" />
</UserControl.Resources>

你如何使用它:

 <Image Source="{Binding OnOff, Converter={StaticResource OnOff}}" Width="100" Height="40" />

你的設置類:

public class Settings : INotifyPropertyChanged  
{
    public Settings(string name, string image, bool onOff)
    {
        Name = name;
        Image = new BitmapImage (new Uri(image, UriKind.Absolute));
        OnOff = onOff;
    }

    public string Name { get; set; }
    public ImageSource Image { get; set; }

    private bool m_onOff;
    public bool OnOff 
        {
        get { return m_onOff; }
        set { 
            m_onOff = value;
            if (PropertyChanged != null)
                {
                PropertyChanged (this, new PropertyChangedEventArgs ("OnOff"));
                }
            } 
        }

    public event PropertyChangedEventHandler PropertyChanged;
}

我認為您需要實現INotifyPropertyChanged接口以通知列表有關基礎類實例中已更改的屬性。 此外,如果您計划在綁定后將其他元素添加到列表中,則應將其作為ObservableCollection。

我已經測試了訂閱SelectionChanged事件。 但是,由於我沒有在移動設備上開發我不知道任何分接選項,也許你可以使用Image_Tap事件。

    listBox1.SelectionChanged += new SelectionChangedEventHandler (listBox1_SelectionChanged);


void listBox1_SelectionChanged (object sender, SelectionChangedEventArgs e)
    {
        foreach (Settings item in e.AddedItems)
        {
            item.OnOff = !item.OnOff;
        }
    }

快速解決方案是,

private void Image_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        var imageSource = ((sender as Image).Source as BitmapImage).UriSource.OriginalString;
        if (imageSource.Contains("On"))
        {
            (sender as Image).Source = new BitmapImage(new Uri("Images/Off.png", UriKind.Relative));
        }
        else
        {
            (sender as Image).Source = new BitmapImage(new Uri("Images/On.png", UriKind.Relative));
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM