How to display a new control through trigger in WPF












-1















Now I got a Grid and I'm trying to display a control, lets say a StackPanel in the grid to cover the origin content when the mouse enters. I put the StackPanel in the first row, made its ZIndex=10(greater than Grid) and property Visibility binding to the Grid's IsMouseOver property. This trick just has one defect: the StackPanel will influence the grid's layout. For example, if the StackPanel's width is up to 500 and the original Grid only 100, the Grid expands quietly annoyingly. Here is the XAML snippet



 <Grid x:Name="FileControlGrid">
!--The StackPanel to display when mouse enters--!
<StackPanel Orientation="Vertical" ZIndex="10" Grid.Row="0"
Visibility="{Binding ElementName=FileControlGrid, Path=IsMouseOver, Converter={StaticResource MouseoverToVisibilityCvt}}">
<...>
</StackPanel>
!--Origin Content below, I need the stackpanel to cover the Image--!
<Image Grid.Row="0" Source="{Binding FilePath, Converter={StaticResource FileiconCvt}}" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Center" MaxWidth="100" MaxHeight="100" Margin="5"/>
<TextBlock Grid.Row="1" Margin="0,5" Text="{Binding FileName, Mode=TwoWay}" FontFamily="Times New Roman" HorizontalAlignment="Left" FontWeight="SemiBold" MaxWidth="150" TextTrimming="WordEllipsis" FontSize="14"/>
</Grid>


I attempted using the Trigger, but instead of setting simple properties, I've no idea how to generate a grandly new control in triggers. Anyone can help?
Images here










share|improve this question

























  • If a control should cover another control, don't nest one in the other. Instead put them in the same parent

    – Erno de Weerd
    Jan 1 at 8:34











  • In fact, I just need the stackpanel to cover the Image. Problem is the stackpanel automatically changes the grid's width. I just put an Figure about the issue. Any good suggestions?@ErnodeWeerd

    – user10356290
    Jan 1 at 9:03













  • You could bind the width of the StackPanel to the width of the image.

    – Erno de Weerd
    Jan 1 at 9:05
















-1















Now I got a Grid and I'm trying to display a control, lets say a StackPanel in the grid to cover the origin content when the mouse enters. I put the StackPanel in the first row, made its ZIndex=10(greater than Grid) and property Visibility binding to the Grid's IsMouseOver property. This trick just has one defect: the StackPanel will influence the grid's layout. For example, if the StackPanel's width is up to 500 and the original Grid only 100, the Grid expands quietly annoyingly. Here is the XAML snippet



 <Grid x:Name="FileControlGrid">
!--The StackPanel to display when mouse enters--!
<StackPanel Orientation="Vertical" ZIndex="10" Grid.Row="0"
Visibility="{Binding ElementName=FileControlGrid, Path=IsMouseOver, Converter={StaticResource MouseoverToVisibilityCvt}}">
<...>
</StackPanel>
!--Origin Content below, I need the stackpanel to cover the Image--!
<Image Grid.Row="0" Source="{Binding FilePath, Converter={StaticResource FileiconCvt}}" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Center" MaxWidth="100" MaxHeight="100" Margin="5"/>
<TextBlock Grid.Row="1" Margin="0,5" Text="{Binding FileName, Mode=TwoWay}" FontFamily="Times New Roman" HorizontalAlignment="Left" FontWeight="SemiBold" MaxWidth="150" TextTrimming="WordEllipsis" FontSize="14"/>
</Grid>


I attempted using the Trigger, but instead of setting simple properties, I've no idea how to generate a grandly new control in triggers. Anyone can help?
Images here










share|improve this question

























  • If a control should cover another control, don't nest one in the other. Instead put them in the same parent

    – Erno de Weerd
    Jan 1 at 8:34











  • In fact, I just need the stackpanel to cover the Image. Problem is the stackpanel automatically changes the grid's width. I just put an Figure about the issue. Any good suggestions?@ErnodeWeerd

    – user10356290
    Jan 1 at 9:03













  • You could bind the width of the StackPanel to the width of the image.

    – Erno de Weerd
    Jan 1 at 9:05














-1












-1








-1








Now I got a Grid and I'm trying to display a control, lets say a StackPanel in the grid to cover the origin content when the mouse enters. I put the StackPanel in the first row, made its ZIndex=10(greater than Grid) and property Visibility binding to the Grid's IsMouseOver property. This trick just has one defect: the StackPanel will influence the grid's layout. For example, if the StackPanel's width is up to 500 and the original Grid only 100, the Grid expands quietly annoyingly. Here is the XAML snippet



 <Grid x:Name="FileControlGrid">
!--The StackPanel to display when mouse enters--!
<StackPanel Orientation="Vertical" ZIndex="10" Grid.Row="0"
Visibility="{Binding ElementName=FileControlGrid, Path=IsMouseOver, Converter={StaticResource MouseoverToVisibilityCvt}}">
<...>
</StackPanel>
!--Origin Content below, I need the stackpanel to cover the Image--!
<Image Grid.Row="0" Source="{Binding FilePath, Converter={StaticResource FileiconCvt}}" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Center" MaxWidth="100" MaxHeight="100" Margin="5"/>
<TextBlock Grid.Row="1" Margin="0,5" Text="{Binding FileName, Mode=TwoWay}" FontFamily="Times New Roman" HorizontalAlignment="Left" FontWeight="SemiBold" MaxWidth="150" TextTrimming="WordEllipsis" FontSize="14"/>
</Grid>


I attempted using the Trigger, but instead of setting simple properties, I've no idea how to generate a grandly new control in triggers. Anyone can help?
Images here










share|improve this question
















Now I got a Grid and I'm trying to display a control, lets say a StackPanel in the grid to cover the origin content when the mouse enters. I put the StackPanel in the first row, made its ZIndex=10(greater than Grid) and property Visibility binding to the Grid's IsMouseOver property. This trick just has one defect: the StackPanel will influence the grid's layout. For example, if the StackPanel's width is up to 500 and the original Grid only 100, the Grid expands quietly annoyingly. Here is the XAML snippet



 <Grid x:Name="FileControlGrid">
!--The StackPanel to display when mouse enters--!
<StackPanel Orientation="Vertical" ZIndex="10" Grid.Row="0"
Visibility="{Binding ElementName=FileControlGrid, Path=IsMouseOver, Converter={StaticResource MouseoverToVisibilityCvt}}">
<...>
</StackPanel>
!--Origin Content below, I need the stackpanel to cover the Image--!
<Image Grid.Row="0" Source="{Binding FilePath, Converter={StaticResource FileiconCvt}}" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Center" MaxWidth="100" MaxHeight="100" Margin="5"/>
<TextBlock Grid.Row="1" Margin="0,5" Text="{Binding FileName, Mode=TwoWay}" FontFamily="Times New Roman" HorizontalAlignment="Left" FontWeight="SemiBold" MaxWidth="150" TextTrimming="WordEllipsis" FontSize="14"/>
</Grid>


I attempted using the Trigger, but instead of setting simple properties, I've no idea how to generate a grandly new control in triggers. Anyone can help?
Images here







wpf






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 1 at 8:15







user10356290

















asked Dec 31 '18 at 9:08









user10356290user10356290

11




11













  • If a control should cover another control, don't nest one in the other. Instead put them in the same parent

    – Erno de Weerd
    Jan 1 at 8:34











  • In fact, I just need the stackpanel to cover the Image. Problem is the stackpanel automatically changes the grid's width. I just put an Figure about the issue. Any good suggestions?@ErnodeWeerd

    – user10356290
    Jan 1 at 9:03













  • You could bind the width of the StackPanel to the width of the image.

    – Erno de Weerd
    Jan 1 at 9:05



















  • If a control should cover another control, don't nest one in the other. Instead put them in the same parent

    – Erno de Weerd
    Jan 1 at 8:34











  • In fact, I just need the stackpanel to cover the Image. Problem is the stackpanel automatically changes the grid's width. I just put an Figure about the issue. Any good suggestions?@ErnodeWeerd

    – user10356290
    Jan 1 at 9:03













  • You could bind the width of the StackPanel to the width of the image.

    – Erno de Weerd
    Jan 1 at 9:05

















If a control should cover another control, don't nest one in the other. Instead put them in the same parent

– Erno de Weerd
Jan 1 at 8:34





If a control should cover another control, don't nest one in the other. Instead put them in the same parent

– Erno de Weerd
Jan 1 at 8:34













In fact, I just need the stackpanel to cover the Image. Problem is the stackpanel automatically changes the grid's width. I just put an Figure about the issue. Any good suggestions?@ErnodeWeerd

– user10356290
Jan 1 at 9:03







In fact, I just need the stackpanel to cover the Image. Problem is the stackpanel automatically changes the grid's width. I just put an Figure about the issue. Any good suggestions?@ErnodeWeerd

– user10356290
Jan 1 at 9:03















You could bind the width of the StackPanel to the width of the image.

– Erno de Weerd
Jan 1 at 9:05





You could bind the width of the StackPanel to the width of the image.

– Erno de Weerd
Jan 1 at 9:05












1 Answer
1






active

oldest

votes


















0














Didn't understand the reason why you want to display the StackPanel in MouseOver but here is a simple solution that should work :




  • Create two properties of Visibility ImageVisiable and StackPanelVisiable.

  • Connect both properties to the Controls

  • MouseEnter event Switch between them


Example :



Xaml Side :



<Grid x:Name="Mouse" MouseEnter="Mouse_MouseEnter" MouseLeave="Mouse_MouseLeave">
<Grid.RowDefinitions>
<RowDefinition Height="100"/>
<RowDefinition Height="100"/>
</Grid.RowDefinitions>
<!--The StackPanel to display when mouse enters-->
<StackPanel Orientation="Vertical" Visibility="{Binding StackPanelVisiable}" Grid.Row="0">
</StackPanel>
<!--Origin Content below, I need the stackpanel to cover the Image-->
<Image Grid.Row="0" Source="/Superman.jpg" Visibility="{Binding ImageVisiable}" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Center" MaxWidth="100" MaxHeight="100" Margin="5"/>
<TextBlock Grid.Row="1" Margin="0,5" Text="{Binding FileName, Mode=TwoWay}" FontFamily="Times New Roman" HorizontalAlignment="Left" FontWeight="SemiBold" MaxWidth="150" TextTrimming="WordEllipsis" FontSize="14"/>
</Grid>


View Model :



private Visibility m_stackVisibility;
private Visibility m_imageVisibility;
public MainVM()
{
m_stackVisibility = Visibility.Visible;
m_imageVisibility = Visibility.Hidden;

}
public Visibility StackPanelVisiable
{
get { return m_stackVisibility; }
set { SetProperty(ref m_stackVisibility , value); }
}
public Visibility ImageVisiable
{
get { return m_imageVisibility; }
set { SetProperty(ref m_imageVisibility, value); }
}

private void Mouse_MouseEnter(object sender, MouseEventArgs e)
{
((MainVM)this.DataContext).StackPanelVisiable = Visibility.Hidden;
((MainVM)this.DataContext).ImageVisiable = Visibility.Visible;
}

private void Mouse_MouseLeave(object sender, MouseEventArgs e)
{
((MainVM)this.DataContext).ImageVisiable = Visibility.Hidden;
((MainVM)this.DataContext).StackPanelVisiable = Visibility.Visible;
}


Hope it helped



Asaf






share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53985567%2fhow-to-display-a-new-control-through-trigger-in-wpf%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    Didn't understand the reason why you want to display the StackPanel in MouseOver but here is a simple solution that should work :




    • Create two properties of Visibility ImageVisiable and StackPanelVisiable.

    • Connect both properties to the Controls

    • MouseEnter event Switch between them


    Example :



    Xaml Side :



    <Grid x:Name="Mouse" MouseEnter="Mouse_MouseEnter" MouseLeave="Mouse_MouseLeave">
    <Grid.RowDefinitions>
    <RowDefinition Height="100"/>
    <RowDefinition Height="100"/>
    </Grid.RowDefinitions>
    <!--The StackPanel to display when mouse enters-->
    <StackPanel Orientation="Vertical" Visibility="{Binding StackPanelVisiable}" Grid.Row="0">
    </StackPanel>
    <!--Origin Content below, I need the stackpanel to cover the Image-->
    <Image Grid.Row="0" Source="/Superman.jpg" Visibility="{Binding ImageVisiable}" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Center" MaxWidth="100" MaxHeight="100" Margin="5"/>
    <TextBlock Grid.Row="1" Margin="0,5" Text="{Binding FileName, Mode=TwoWay}" FontFamily="Times New Roman" HorizontalAlignment="Left" FontWeight="SemiBold" MaxWidth="150" TextTrimming="WordEllipsis" FontSize="14"/>
    </Grid>


    View Model :



    private Visibility m_stackVisibility;
    private Visibility m_imageVisibility;
    public MainVM()
    {
    m_stackVisibility = Visibility.Visible;
    m_imageVisibility = Visibility.Hidden;

    }
    public Visibility StackPanelVisiable
    {
    get { return m_stackVisibility; }
    set { SetProperty(ref m_stackVisibility , value); }
    }
    public Visibility ImageVisiable
    {
    get { return m_imageVisibility; }
    set { SetProperty(ref m_imageVisibility, value); }
    }

    private void Mouse_MouseEnter(object sender, MouseEventArgs e)
    {
    ((MainVM)this.DataContext).StackPanelVisiable = Visibility.Hidden;
    ((MainVM)this.DataContext).ImageVisiable = Visibility.Visible;
    }

    private void Mouse_MouseLeave(object sender, MouseEventArgs e)
    {
    ((MainVM)this.DataContext).ImageVisiable = Visibility.Hidden;
    ((MainVM)this.DataContext).StackPanelVisiable = Visibility.Visible;
    }


    Hope it helped



    Asaf






    share|improve this answer




























      0














      Didn't understand the reason why you want to display the StackPanel in MouseOver but here is a simple solution that should work :




      • Create two properties of Visibility ImageVisiable and StackPanelVisiable.

      • Connect both properties to the Controls

      • MouseEnter event Switch between them


      Example :



      Xaml Side :



      <Grid x:Name="Mouse" MouseEnter="Mouse_MouseEnter" MouseLeave="Mouse_MouseLeave">
      <Grid.RowDefinitions>
      <RowDefinition Height="100"/>
      <RowDefinition Height="100"/>
      </Grid.RowDefinitions>
      <!--The StackPanel to display when mouse enters-->
      <StackPanel Orientation="Vertical" Visibility="{Binding StackPanelVisiable}" Grid.Row="0">
      </StackPanel>
      <!--Origin Content below, I need the stackpanel to cover the Image-->
      <Image Grid.Row="0" Source="/Superman.jpg" Visibility="{Binding ImageVisiable}" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Center" MaxWidth="100" MaxHeight="100" Margin="5"/>
      <TextBlock Grid.Row="1" Margin="0,5" Text="{Binding FileName, Mode=TwoWay}" FontFamily="Times New Roman" HorizontalAlignment="Left" FontWeight="SemiBold" MaxWidth="150" TextTrimming="WordEllipsis" FontSize="14"/>
      </Grid>


      View Model :



      private Visibility m_stackVisibility;
      private Visibility m_imageVisibility;
      public MainVM()
      {
      m_stackVisibility = Visibility.Visible;
      m_imageVisibility = Visibility.Hidden;

      }
      public Visibility StackPanelVisiable
      {
      get { return m_stackVisibility; }
      set { SetProperty(ref m_stackVisibility , value); }
      }
      public Visibility ImageVisiable
      {
      get { return m_imageVisibility; }
      set { SetProperty(ref m_imageVisibility, value); }
      }

      private void Mouse_MouseEnter(object sender, MouseEventArgs e)
      {
      ((MainVM)this.DataContext).StackPanelVisiable = Visibility.Hidden;
      ((MainVM)this.DataContext).ImageVisiable = Visibility.Visible;
      }

      private void Mouse_MouseLeave(object sender, MouseEventArgs e)
      {
      ((MainVM)this.DataContext).ImageVisiable = Visibility.Hidden;
      ((MainVM)this.DataContext).StackPanelVisiable = Visibility.Visible;
      }


      Hope it helped



      Asaf






      share|improve this answer


























        0












        0








        0







        Didn't understand the reason why you want to display the StackPanel in MouseOver but here is a simple solution that should work :




        • Create two properties of Visibility ImageVisiable and StackPanelVisiable.

        • Connect both properties to the Controls

        • MouseEnter event Switch between them


        Example :



        Xaml Side :



        <Grid x:Name="Mouse" MouseEnter="Mouse_MouseEnter" MouseLeave="Mouse_MouseLeave">
        <Grid.RowDefinitions>
        <RowDefinition Height="100"/>
        <RowDefinition Height="100"/>
        </Grid.RowDefinitions>
        <!--The StackPanel to display when mouse enters-->
        <StackPanel Orientation="Vertical" Visibility="{Binding StackPanelVisiable}" Grid.Row="0">
        </StackPanel>
        <!--Origin Content below, I need the stackpanel to cover the Image-->
        <Image Grid.Row="0" Source="/Superman.jpg" Visibility="{Binding ImageVisiable}" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Center" MaxWidth="100" MaxHeight="100" Margin="5"/>
        <TextBlock Grid.Row="1" Margin="0,5" Text="{Binding FileName, Mode=TwoWay}" FontFamily="Times New Roman" HorizontalAlignment="Left" FontWeight="SemiBold" MaxWidth="150" TextTrimming="WordEllipsis" FontSize="14"/>
        </Grid>


        View Model :



        private Visibility m_stackVisibility;
        private Visibility m_imageVisibility;
        public MainVM()
        {
        m_stackVisibility = Visibility.Visible;
        m_imageVisibility = Visibility.Hidden;

        }
        public Visibility StackPanelVisiable
        {
        get { return m_stackVisibility; }
        set { SetProperty(ref m_stackVisibility , value); }
        }
        public Visibility ImageVisiable
        {
        get { return m_imageVisibility; }
        set { SetProperty(ref m_imageVisibility, value); }
        }

        private void Mouse_MouseEnter(object sender, MouseEventArgs e)
        {
        ((MainVM)this.DataContext).StackPanelVisiable = Visibility.Hidden;
        ((MainVM)this.DataContext).ImageVisiable = Visibility.Visible;
        }

        private void Mouse_MouseLeave(object sender, MouseEventArgs e)
        {
        ((MainVM)this.DataContext).ImageVisiable = Visibility.Hidden;
        ((MainVM)this.DataContext).StackPanelVisiable = Visibility.Visible;
        }


        Hope it helped



        Asaf






        share|improve this answer













        Didn't understand the reason why you want to display the StackPanel in MouseOver but here is a simple solution that should work :




        • Create two properties of Visibility ImageVisiable and StackPanelVisiable.

        • Connect both properties to the Controls

        • MouseEnter event Switch between them


        Example :



        Xaml Side :



        <Grid x:Name="Mouse" MouseEnter="Mouse_MouseEnter" MouseLeave="Mouse_MouseLeave">
        <Grid.RowDefinitions>
        <RowDefinition Height="100"/>
        <RowDefinition Height="100"/>
        </Grid.RowDefinitions>
        <!--The StackPanel to display when mouse enters-->
        <StackPanel Orientation="Vertical" Visibility="{Binding StackPanelVisiable}" Grid.Row="0">
        </StackPanel>
        <!--Origin Content below, I need the stackpanel to cover the Image-->
        <Image Grid.Row="0" Source="/Superman.jpg" Visibility="{Binding ImageVisiable}" Stretch="Fill" HorizontalAlignment="Left" VerticalAlignment="Center" MaxWidth="100" MaxHeight="100" Margin="5"/>
        <TextBlock Grid.Row="1" Margin="0,5" Text="{Binding FileName, Mode=TwoWay}" FontFamily="Times New Roman" HorizontalAlignment="Left" FontWeight="SemiBold" MaxWidth="150" TextTrimming="WordEllipsis" FontSize="14"/>
        </Grid>


        View Model :



        private Visibility m_stackVisibility;
        private Visibility m_imageVisibility;
        public MainVM()
        {
        m_stackVisibility = Visibility.Visible;
        m_imageVisibility = Visibility.Hidden;

        }
        public Visibility StackPanelVisiable
        {
        get { return m_stackVisibility; }
        set { SetProperty(ref m_stackVisibility , value); }
        }
        public Visibility ImageVisiable
        {
        get { return m_imageVisibility; }
        set { SetProperty(ref m_imageVisibility, value); }
        }

        private void Mouse_MouseEnter(object sender, MouseEventArgs e)
        {
        ((MainVM)this.DataContext).StackPanelVisiable = Visibility.Hidden;
        ((MainVM)this.DataContext).ImageVisiable = Visibility.Visible;
        }

        private void Mouse_MouseLeave(object sender, MouseEventArgs e)
        {
        ((MainVM)this.DataContext).ImageVisiable = Visibility.Hidden;
        ((MainVM)this.DataContext).StackPanelVisiable = Visibility.Visible;
        }


        Hope it helped



        Asaf







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Dec 31 '18 at 11:06









        AsafAsaf

        452




        452






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53985567%2fhow-to-display-a-new-control-through-trigger-in-wpf%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Mossoró

            Error while reading .h5 file using the rhdf5 package in R

            Pushsharp Apns notification error: 'InvalidToken'