切换按钮,打开Windows对话框

时间:2017-08-08 15:07:06

标签: wpf xaml

我有一个这样的切换按钮:

                       <ToggleButton Name="loadSlideTitle" IsChecked="{Binding SlideTitleLoaded, Mode=OneWay}"  Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" Background="Transparent" Command="{Binding DataContext.LoadSlideTitleCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}}">

                            <ToggleButton.Template>
                                <ControlTemplate TargetType="{x:Type ToggleButton}">
                                    <Grid RenderTransformOrigin="0.5,0.5" x:Name="bg">
                                        <Image x:Name ="loadSlideTitle_image" Source="/Import_TitleImport.png"/>
                                    </Grid>
                                    <ControlTemplate.Triggers>
                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="IsMouseOver"  Value="True" />
                                                <Condition Property="IsChecked" Value="False" />
                                            </MultiTrigger.Conditions>
                                            <Setter TargetName="loadSlideTitle_image" Property="Source" Value="/Import_TitleImport_Mouseover.png"/>
                                        </MultiTrigger>

                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="IsMouseOver"  Value="False" />
                                                <Condition Property="IsChecked" Value="True" />
                                            </MultiTrigger.Conditions>
                                            <Setter TargetName="loadSlideTitle_image" Property="Source" Value="/Import_TitleDelete.png"/>
                                        </MultiTrigger>

                                        <MultiTrigger>
                                            <MultiTrigger.Conditions>
                                                <Condition Property="IsMouseOver"  Value="True" />
                                                <Condition Property="IsChecked" Value="True" />
                                            </MultiTrigger.Conditions>
                                            <Setter TargetName="loadSlideTitle_image" Property="Source" Value="/Import_TitleDelete_Mouseover.png"/>
                                        </MultiTrigger>


                                        <Trigger Property="ButtonBase.IsPressed"  Value ="True">
                                            <Setter TargetName="bg" Property="RenderTransform">
                                                <Setter.Value>
                                                    <ScaleTransform ScaleX="0.9" ScaleY="0.9"/>
                                                </Setter.Value>
                                            </Setter>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </ToggleButton.Template>

                        </ToggleButton>

然后通过调用以下函数打开一个Windows对话框:

public class Slide_1_6
    {
        public bool SlideTitleLoaded { get; private set; }

        //it holds the slide title image path
        public string SlideTitleImagePath { get; private set; }



        public Slide_1_6(string SlideTitleImagePath, string SlideNote)
            :base(SlideNote)
        {
            this.SlideTitleImagePath = SlideTitleImagePath;
        }


        //this method opens the file dialog that let the user selects the logo image
        public void LoadTitle(string projectName)
        {
            if (!SlideTitleLoaded)
            {
                // Configure open file dialog box
                OpenFileDialog dlg = new OpenFileDialog();
                dlg.FileName = ""; // Default file name
                dlg.DefaultExt = ".png"; // Default file extension
                dlg.Filter = "PNG Images (*.png)|*.png|JPG Images (*.jpg)|*.jpg|" + "JPEG Images (*.jpeg)|*.jpeg|All files (*.*)|*.*"; // Filter files by extension
                dlg.Title = "Select Slide Title";

                // Show open file dialog box
                dlg.ShowDialog();

                //if proper file is selected
                if (dlg.FileName != "")
                {
                    //store title path in local variable
                    string title_path = dlg.FileName;

                    bool titleSizeOK = CheckTitleImageSize(title_path);

                    //check if title image has the right size
                    if (!titleSizeOK)
                    {
                        SlideTitleLoaded = false;
                        return;
                    }


                    try
                    {
                        File.Copy(title_path, projectName + Path.GetFileName(title_path), true); //copy the selected image to the project folder
                    }
                    catch { }

                    SlideTitleImagePath = projectName + Path.GetFileName(title_path);
                    SlideTitleLoaded = true;



                }
            }

            else
            {
                SlideTitleImagePath = "";
                SlideTitleLoaded = false;
            }



        }

        private bool CheckTitleImageSize(string titlePath)
        {
            Image image = Image.FromFile(titlePath);

            if (image.Width == 1920 && image.Height == 260)
                return true;
            else
            {
                MessageBox.Show("You have selected an image with invalid resolution. Resolution must be 1920x260. Please select another image.");
                return false;
            }
        }

    }

问题是,一旦我点击按钮,它就会切换并在Windows对话框弹出之前更改图像。我希望只有当用户选择正确的文件并关闭对话框时才能切换按钮。

我已经可以通过使用普通按钮并在模型&#39; Slide_1_6&#39;上使用INotifyPropertyChange来实现所需的行为。但是,我想纯粹在xaml中这样做。

1 个答案:

答案 0 :(得分:0)

尝试使用ToggleButton的Tag属性。例如:如果选择了文件,则将Tag属性设置为&#34; 1&#34;否则为&#34; 0&#34;。 使用Style.Triggers,您可以检测到更改。

具有按钮背景的示例

<ToggleButton>
   <ToggleButton.Style>
       <Style TargetType="{x:Type ToggleButton}">
           <Style.Triggers>
               <Trigger Property="Tag" Value="1">
                   <Setter Property="Background" Value="Red" />
               </Trigger>
               <Trigger Property="Tag" Value="0">
                   <Setter Property="Background" Value="Blue" />
               </Trigger>
           </Style.Triggers>
       </Style>
   </ToggleButton.Style>
</ToggleButton>

将标记值更改为&#34; 1&#34;或&#34; 0&#34;背景应该改变。