如何在xamarin中隐藏导航工具栏图标?

pkln4tw6  于 2023-01-15  发布在  其他
关注(0)|答案(6)|浏览(206)

我想在xamarin中隐藏导航栏按钮。我如何使用绑定来实现这一点。工具栏项没有**“IsVisible”**属性。
下面是我的xaml代码

请帮我解决这个问题。

jdgnovmf

jdgnovmf1#

我建议构建一个可绑定的ToolBoxItem,这样你就可以通过视图模型属性来控制可见性。
实现可能如下所示:

public class BindableToolbarItem : ToolbarItem
{
    public static readonly BindableProperty IsVisibleProperty = BindableProperty.Create(nameof(IsVisible), typeof(bool), typeof(BindableToolbarItem), true, BindingMode.TwoWay, propertyChanged: OnIsVisibleChanged);

    public bool IsVisible
    {
        get => (bool)GetValue(IsVisibleProperty);
        set => SetValue(IsVisibleProperty, value);
    }

    private static void OnIsVisibleChanged(BindableObject bindable, object oldvalue, object newvalue)
    {
        var item = bindable as BindableToolbarItem;

        if (item == null || item.Parent == null)
            return;

        var toolbarItems = ((ContentPage)item.Parent).ToolbarItems;

        if ((bool)newvalue && !toolbarItems.Contains(item))
        {
            Device.BeginInvokeOnMainThread(() => { toolbarItems.Add(item); });
        }
        else if (!(bool)newvalue && toolbarItems.Contains(item))
        {
            Device.BeginInvokeOnMainThread(() => { toolbarItems.Remove(item); });
        }
    }
}
dgiusagp

dgiusagp2#

正如你自己发现的那样,IsVisible并不存在,所以如果你仍然想要的话,你必须自己实现这样的功能。
另一种方法是在页面的代码隐藏中处理它,并在需要时删除或添加工具栏项。
添加和删除很简单,只需向ToolbarItems集合添加和删除项即可:例如ToolbarItems.RemoveAt(0);将删除第一个工具栏项。

v09wglhw

v09wglhw3#

把@Gerald answer付诸行动,可以这样做:

void Done_Clicked(System.Object sender, System.EventArgs e)
{
    //Do somthing and hide the done item
    ShowDoneToolbarItem(false, (ToolbarItem)sender);
}

void Entry_Focused(System.Object sender, Xamarin.Forms.FocusEventArgs e)
{
    //Show the done item
    ShowDoneToolbarItem(true);
}

void ShowDoneToolbarItem(bool show, ToolbarItem item = null)
{
    if(show)
    {
        ToolbarItem done = new ToolbarItem();
        done.Text = "Done";
        done.Clicked += Done_Clicked;
        ToolbarItems.Add(done);
    }
    else if(item != null)
    {
        ToolbarItems.Remove(item);
    }
}

这更简洁,并且从后面的代码开始工作。

nzkunb0c

nzkunb0c4#

我们需要前端的IsVisible属性,因为xamarin没有这个属性,你可以使用Device.RuntimePlatform来真实的检查应用程序正在运行的设备,因为我的代码在XAML文件的.cs中,我们可以使用xaml.cs来将项目插入屏幕。()来执行逻辑并检查我的设备是否在哪个平台上,因为我不希望它在UWP中显示工具栏。代码位于XAML文件的.cs中:

public kingTest()
{
InitializeComponent();
if((Device.RuntimePlatform == "Android")||(Device.RuntimePlatform == "iOS"))
{
ToolbarItem toolbar = new ToolbarItem();
toolbar.IconImageSource = "ic_ToolBar.png";
this.ToolbarItems.Add(toolbar);
}

        };
h22fl7wq

h22fl7wq5#

我使用重载构造函数很容易地实现了这一点。下面是一个例子:

    • 视图**(添加名称属性):
<ContentPage x:Name="ContentPage"
    <!-- rest of the tag -->
    />
    • 代码隐藏**(添加工具栏项):
public partial class ExamplePage : ContentPage
{
    public ExamplePage()
    {
        InitializeComponent();
        BindingContext = this;

        var saveToolbarItem = new ToolbarItem { Text = "Save" };
        saveToolbarItem.Clicked += YourMethodToBeRan;

        ContentPage.ToolbarItems.Add(saveToolbarItem);
    }

    public ExamplePage(Object object)
    {
        InitializeComponent();
        BindingContext = this;

        var updateToolbarItem = new ToolbarItem { Text = "Update" };
        updateToolbarItem.Clicked += YourMethodToBeRan;

        var deleteToolbarItem = new ToolbarItem { Text = "Delete" };
        deleteToolbarItem.Clicked += YourMethodToBeRan;

        ContentPage.ToolbarItems.Add(updateToolbarItem);
        ContentPage.ToolbarItems.Add(deleteToolbarItem);
    }

    // rest of the class
}

上面的伪代码将在类示例化时添加"Save"工具栏项,或者在提供参数时添加"Update"和"Delete"。
这不像IsEnabled/IsVisible布尔值那样优雅,但它是朝着正确方向迈出的一步。按照这种思路,您可以在运行时通过添加和删除子工具栏来修改子工具栏,使其"显示"和"隐藏"。
祝你好运!

ryhaxcpt

ryhaxcpt6#

我不知道@tequila slammer的解决方案是否完全适用于Xamarin,但对我们来说,它只适用于. Net Maui(Xamarin的演变),并将IsVisible属性绑定到一个变量。
从ContentPage的ToolbarItem列表中移除BindableToolbarItem后,它将永远与IsVisible绑定到的对象断开连接。
例如:我们希望使用此控件来隐藏或显示导航到管理员屏幕的ToolbarItem,如果我在应用启动时以管理员身份登录,则该项目会在那里......太好了。如果我随后注销并以非管理员身份登录,则该项目不会在那里......完美。如果我随后注销并以管理员身份登录,则该项目不会在那里(propertyChanged:OnIsVisibleChanged从未激发)...:-(。
对我们来说不是什么大事,如果你想要管理员访问权限,那么停止应用程序并启动应用程序以管理员身份登录并不是什么大问题。

相关问题