WPf 带滚动条WrapPanel 自动换行 和控件右键菜单

技能点包括 WPf 样式的引用 数据的验证和绑定 比较适合初学者

前台:

 <Window.Resources>
        <local:PathToSource x:Key="n2"/>
        <Style x:Key="{x:Type ContextMenu}" TargetType="{x:Type ContextMenu}">
            <Setter Property="OverridesDefaultStyle" Value="True"/>
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ContextMenu}">
                        <Border Background="#CD222120" CornerRadius="7, 7, 8, 8" BorderBrush="DarkGray" BorderThickness="2" Opacity="0.96">
                            <StackPanel ClipToBounds="True" Orientation="Vertical" IsItemsHost="True" Margin="5,4,5,4"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <ControlTemplate x:Key="{x:Static MenuItem.TopLevelItemTemplateKey}" TargetType="{x:Type MenuItem}">
            <Border Name="Border" >
                <Grid>
                    <ContentPresenter Margin="6,3,6,3" ContentSource="Header" RecognizesAccessKey="True" />
                </Grid>
            </Border>
        </ControlTemplate>

        <DataTemplate x:Key="Wrapitem">
            <Grid  Height="86"   Width="86"  >
                <Grid.ContextMenu>
                    <ContextMenu Name="cm" StaysOpen="true">
                        <MenuItem Header="update"/>
                        <MenuItem Header="Save"/>
                        <MenuItem Header="SaveAs"/>
                    </ContextMenu>

                </Grid.ContextMenu>
                <Image Margin="8,8,8,24" Source="{Binding Path=Url,Converter={StaticResource n2}}"/>
                <Label Content="{Binding Path=Text}" Height="22" Width="45"   VerticalAlignment="Bottom"/>
    	</Grid>
            
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <ListBox x:Name="list" Margin="124,63,109,44"  ScrollViewer.HorizontalScrollBarVisibility="Hidden"   ItemTemplate="{StaticResource Wrapitem}">
            <ListBox.Resources>
                <Style TargetType="ListBoxItem">

                    <Style.Resources>

                        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#FFA1A1A1"/>
                    </Style.Resources>
                </Style>
            </ListBox.Resources>

         
                <!--<ListBox.ItemsPanel >
    			<ItemsPanelTemplate>
                    <WrapPanel   Orientation="Horizontal" IsItemsHost="True"/>
				</ItemsPanelTemplate>
    		
			</ListBox.ItemsPanel>-->
            <ListBox.Template>
                <ControlTemplate TargetType="{x:Type ListBox}">
                    <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
                        <WrapPanel Orientation="Horizontal" IsItemsHost="True" ScrollViewer.CanContentScroll="True"/>
                    </ScrollViewer>
                </ControlTemplate>
            </ListBox.Template>
        </ListBox>
   
    
        
    </Grid>
</Window>

后台:

   /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            load();
        }

        public void load() 
        {
            ObservableCollection<Mean> ListMean = new ObservableCollection<Mean>() 
            {
                 new Mean(){Text="001",Url="i"},
                 new Mean(){Text="002",Url="i"},
                 new Mean(){Text="003",Url="ii"},
                 new Mean(){Text="004",Url="i"},
                 new Mean(){Text="005",Url="i"},
                 new Mean(){Text="006",Url="ii"},
                 new Mean(){Text="007",Url="i"},
                 new Mean(){Text="008",Url="i"},
                 new Mean(){Text="009",Url="i"},
                 new Mean(){Text="010",Url="i"},
                 new Mean(){Text="011",Url="ii"},
                 new Mean(){Text="012",Url="i"},
                 new Mean(){Text="013",Url="i"},
                 new Mean(){Text="014",Url="i"},
                 new Mean(){Text="015",Url="i"},
                 new Mean(){Text="016",Url="i"},  
                 new Mean(){Text="017",Url="i"}
            };
            list.ItemsSource = ListMean;
        }
    }
    public class Mean : INotifyPropertyChanged
    {
        private string text;

        public string Text
        {
            get { return text; }
            set { text = value; OnPropertyChanged("Text"); }
        }
        private string url;

        public string Url
        {
            get { return url; }
            set { url = value; OnPropertyChanged("Url"); }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {

            if (PropertyChanged != null)
            {

                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

            }

        }
    }
    public class PathToSource:IValueConverter
    {
       public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       {
         
           string url = string.Format(@"/Images/{0}.jpg", (string)value=="i"?"i":"ii");
           return new BitmapImage(new Uri(url,UriKind.Relative));
       }
       public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
       {
           throw new NotImplementedException();
       }
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小慧哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值